【quarkus系列】构建可执行文件native image

news2024/9/8 10:56:55

目录

  • 序言
    • 为什么选择 Quarkus Native Image?
      • 性能优势
      • 便捷的云原生部署
  • 搭建项目
    • 构建可执行文件
      • 方式一:配置GraalVM
      • 方式二:容器运行
      • 错误示例
      • 构建过程分析
    • 创建docker镜像
      • 基于可执行文件命令式构建
      • 基于dockerfile构建
        • 方式一:构建micro base image
        • 方式二:构建minimal base image
        • 方式三:使用dockerfile多阶段构建

序言

为什么选择 Quarkus Native Image?

性能优势

  • 快速启动时间
    传统的 Java 应用运行在 JVM(Java Virtual Machine)上,启动时需要进行类加载、字节码解释和 JIT(Just-In-Time)编译等一系列过程,这些过程会导致启动时间较长。而 Quarkus 的 Native Image 使用 GraalVM 进行本地编译,直接将 Java 应用编译成机器码。这样,在应用启动时,几乎不需要任何额外的初始化步骤,启动时间可以快一个数量级。
    例如,传统的 Java 应用可能需要几秒钟甚至更长时间才能完全启动,而使用 Quarkus Native Image 的应用通常在几十毫秒内即可启动。这对于需要快速响应和弹性扩展的场景(如微服务架构和无服务器架构)尤为重要。
  • 低内存占用
    由于 Quarkus Native Image 在编译时进行了一系列优化,包括去除未使用的代码和优化内存布局,生成的本地二进制文件的内存占用显著减少。这种优化不仅减少了运行时的内存消耗,还降低了垃圾回收的频率和开销。
    对于在云环境中运行的应用,这种内存占用的减少意味着可以在相同的硬件资源上运行更多的实例,提升了资源利用率和性价比。

便捷的云原生部署

  • 轻量级容器
    传统的 Java 应用在容器化部署时,需要包含完整的 JVM 环境,这会增加容器镜像的大小。而 Quarkus Native Image 生成的二进制文件不依赖 JVM,可以显著减小容器镜像的体积。例如,一个传统的 Java 应用的容器镜像可能有几百 MB,而使用 Quarkus Native Image 的镜像可能只有几十 MB。

这种轻量级容器的优势在于:
1、更快的镜像拉取:在部署和扩展应用时,镜像的拉取速度更快,减少了启动时间。
2、更低的存储成本:减小了存储镜像所需的空间,节省了存储成本。

  • Kubernetes 集成
    Quarkus 天生为 Kubernetes 设计,提供了很多开箱即用的特性,简化了在 Kubernetes 环境中的部署和管理。例如:
    1、自动生成 Kubernetes 资源配置:通过 Quarkus 的扩展,可以自动生成 Deployment、Service 等 Kubernetes 资源配置,减少了手动配置的工作量。
    2、与 Kubernetes 原生工具集成:Quarkus 提供了与 Kubernetes 原生工具(如 Helm 和 OpenShift)的集成,方便应用的打包、部署和管理。
    3、健康检查和监控:Quarkus 提供了内置的健康检查、指标收集和分布式跟踪支持,方便在 Kubernetes 环境中进行应用的监控和管理。

搭建项目

之前的文章,按照官网指南构建第一个quarkus项目,并启动运行。
【quarkus系列】创建quarkus第一个应用程序

这篇文章,我们开始学习如何本地构建quarkus可执行文件。

官网指南中,本地开发环境需要满足以下条件:

1、按照JDK17+版本;

2、本地有docker环境;

接着上篇文章中的开发代码继续开发:

关于构建成native本地文件核心配置pom.xml

<profiles>
    <profile>
        <id>native</id>
        <activation>
            <property>
                <name>native</name>
            </property>
        </activation>
        <properties>
            <skipITs>false</skipITs>
            <quarkus.native.enabled>true</quarkus.native.enabled>
        </properties>
    </profile>
</profiles>

默认构建会执行native文件;

其次或者使用命令行 -Dquarkus.native.enabled=true 作为属性传递

构建可执行文件

官网指南给出多种构建方式,优先介绍常用的方式:

方式一:配置GraalVM

方式一:(推荐使用方式二)

安装并配置GraalVM,官网链接https://quarkus.io/guides/building-native-image#configuring-graalvm

如图:
在这里插入图片描述

  • 运行命令
./mvnw install -Dnative

如果使用该命令,没有配置GraalVM,执行报错如下:

[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal io.quarkus.platform:quarkus-maven-plugin:2.13.3.Final:build (default) on project getting-started: Failed to build quarkus application: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]         [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Cannot find the `native-image` in the GRAALVM_HOME, JAVA_HOME and System PATH. Install it using `gu install native-image`
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.getNativeImageBuildRunner(NativeImageBuildStep.java:314)
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:212)
[ERROR]         at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
[ERROR]         at java.base/java.lang.reflect.Method.invoke(Method.java:580)
[ERROR]         at io.quarkus.deployment.ExtensionLoader$3.execute(ExtensionLoader.java:909)
[ERROR]         at io.quarkus.builder.BuildContext.run(BuildContext.java:281)
[ERROR]         at org.jboss.threads.ContextHandler$1.runWith(ContextHandler.java:18)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2449)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1478)
[ERROR]         at java.base/java.lang.Thread.run(Thread.java:1583)

方式二:容器运行

相对于方式一,更推荐使用方式二开发,无需配置以上环境变量,直接启动docker即可;

必要条件,确保有一个有效的容器运行时(Docker、podman)环境

首先将本地服务器docker启动;

  • 构建可执行命令:
./mvnw install -Dnative -DskipTests -Dquarkus.native.container-build=true
  • 显示选择运行时容器

官方也可以显式选择容器运行,命令如下:

此处我们仍然选择使用docker

./mvnw install -Dnative -Dquarkus.native.container-build=true -Dquarkus.native.container-runtime=docker
  • 优化构建命令
    使用命令构建不方便,也可以将其设置在application.properties
    quarkus.native.container-build=true

运行命令:./mvnw install -Dnative -DskipTests即可

错误示例

如果docker未启动,则报错如图:
在这里插入图片描述
日志中很明显,提示需要运行docker

构建过程分析

  • docker启动之后,开始pull image ,如图:
    在这里插入图片描述
  • docker同时会启动构建native镜像的容器,如图:
    在这里插入图片描述
  • 构建完成之后,本地项目会生成可执行文件,如图:
    在这里插入图片描述

创建docker镜像

基于可执行文件命令式构建

构建命令

./mvnw package -Dnative -Dquarkus.native.container-build=true -Dquarkus.container-image.build=true

控制台日志:

Finished generating 'getting-started-1.0.0-SNAPSHOT-runner' in 3m 14s.
[INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] docker run --env LANG=C --rm -v /quarkus-projects/getting-started/target/getting-started-1.0.0-SNAPSHOT-native-image-source-jar:/project:z --entrypoint /bin/bash quay.io/quarkus/ubi-quarkus-native-image:22.2-java17 -c objcopy --strip-debug getting-started-1.0.0-SNAPSHOT-runner
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 218135ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  03:43 min
[INFO] Finished at: 2024-05-13T18:47:06+08:00
[INFO] ------------------------------------------------------------------------

从控制台中可以看到,已经完成docker镜像的创建以及镜像标签:22.2-java17

输入docker images查看镜像是否生成
在这里插入图片描述

基于dockerfile构建

方式一:构建micro base image

Micro base image 通常是指极度精简的基础镜像,这类镜像仅包含运行应用所需的最基本的依赖和工具,去除了所有不必要的部分。
特点:
1、极小的体积:micro base image 的目标是将镜像体积降到最低,以便快速传输和启动。
2、最小依赖:只包含运行应用所需的最基本的库和工具,通常没有包管理器、shell 等组件。
3、安全性:由于镜像内的组件极少,减少了攻击面,提高了安全性。
4、性能:更小的镜像体积和更少的组件有助于快速启动和高效运行。

路径src/main/docker,文件名Dockerfile.native-micro

内容如下:

FROM quay.io/quarkus/quarkus-micro-image:2.0
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

与命令同理,一样需要依赖本机的可执行文件,故不能删除可执行文件

可以使用以下命令生成 docker 映像:

docker build -f src/main/docker/Dockerfile.native-micro -t quarkus-quickstart/getting-started .

运行镜像命令

docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started
方式二:构建minimal base image

Minimal base image 通常指的是精简但仍保留了一些基础工具和库的镜像,这类镜像比 micro base image 体积稍大,但更易用。

特点
1、较小的体积:相比完整的操作系统镜像,minimal base image 体积较小,但比 micro base image 略大。
2、基本工具和库:包含一些常用的工具和库,如包管理器、shell、调试工具等,方便开发和调试。
3、较高的灵活性:在保持精简的同时,提供了一定的灵活性和便利性,适合大多数应用场景。
4、易用性:提供了更多的基础设施支持,易于使用和配置。
路径:src/main/docker,文件名Dockerfile.native

内容如下:

FROM registry.access.redhat.com/ubi8/ubi-minimal:8.9
WORKDIR /work/
RUN chown 1001 /work \
   && chmod "g+rwX" /work \
   && chown 1001:root /work
COPY --chown=1001:root target/*-runner /work/application

EXPOSE 8080
USER 1001

CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

以上两种方式,均需要本地生成native可执行文件,故如果本地可执行文件删除,则需要先执行命令:./mvnw install -Dnative -DskipTests

方式三:使用dockerfile多阶段构建

使用dockerfile直接在容器中生成本机可执行文件,同时完成镜像的构建;

第一阶段使用 Maven 或 Gradle 构建本机可执行文件;

第二阶段是复制生成的本机可执行文件的最小映像;

Dockerfile

## Stage 1 : build with maven builder image with native capabilities
FROM quay.io/quarkus/ubi-quarkus-mandrel-builder-image:jdk-21 AS build
COPY --chown=quarkus:quarkus mvnw /code/mvnw
COPY --chown=quarkus:quarkus .mvn /code/.mvn
COPY --chown=quarkus:quarkus pom.xml /code/
USER quarkus
WORKDIR /code
RUN ./mvnw -B org.apache.maven.plugins:maven-dependency-plugin:3.1.2:go-offline
COPY src /code/src
RUN ./mvnw package -Dnative

## Stage 2 : create the docker final image
FROM quay.io/quarkus/quarkus-micro-image:2.0
WORKDIR /work/
COPY --from=build /code/target/*-runner /work/application

# set up permissions for user `1001`
RUN chmod 775 /work /work/application \
 && chown -R 1001 /work \
 && chmod -R "g+rwX" /work \
 && chown -R 1001:root /work

EXPOSE 8080
USER 1001

CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]

同理将dockerfile文件,路径src/main/docker/Dockerfile.multistage.

构建镜像命令

docker build -f src/main/docker/Dockerfile.multistage -t quarkus-quickstart/getting-started .

运行命令

docker run -i --rm -p 8080:8080 quarkus-quickstart/getting-started

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1703669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fpga系列 HDL 00 : 可编程逻辑器件原理

一次性可编程器件&#xff08;融保险丝实现&#xff09; 一次性可编程器件&#xff08;One-Time Programmable Device&#xff0c;简称 OTP&#xff09;是一种在制造后仅能编程一次的存储设备。OTP器件在编程后数据不可更改。这些器件在很多应用场景中具有独特的优势和用途。 …

重生之我要精通JAVA--第六周笔记

File 路径 相对路径 路径1&#xff1a;“a.txt” 路径2&#xff1a;“abc\\a.txt” 绝对路径 路径1&#xff1a;“c:\\a.txt” 路径2&#xff1a;“c:\\abc\\a.txt” File对象就表示一个路径&#xff0c;可以是文件的路径、也可以是文件夹的路径这个路径可以是存在的&…

c++ (命名空间 字符串)

思维导图&#xff1a; 定义自己得命名空间myspace,在myspace中定义string类型变量s1,再定义一个函数完成字符串逆置 #include <iostream> #include <cstring> //定义自己得命名空间myspace,在myspace中定义string类型变量s1,再定义一个函数完成字符串逆置 using n…

西门子smart line触摸屏软件安装 WinCC Flexible Smart V4SP1 V3

提示&#xff1a;Wincc flexible smart软件为西门子Smart line系列触摸屏的专用组态软件&#xff0c;这款屏不能用博途来组态&#xff0c;只能用这个软件来组态。西门子Smart line系列触摸屏的常用型号为SMART 700 IE V3/V4&#xff0c;SMART 1000 IE V3/V4。 Wincc flexible …

引力为什么会让时间变慢,给你通俗的解读

爱因斯坦的狭义相对论表明&#xff0c;速度会让时间变慢&#xff0c;速度越快时间就越慢。而广义相对论告诉我们&#xff0c;引力同样会让时间变慢&#xff0c;引力越强时间就越慢。 时间膨胀 速度对时间的影响就先不解释了&#xff0c;之前的科普文章介绍了很多&#xff0c;今…

Android开发 -- JNI开发

1.配置JNI环境 创建JNI文件夹 在项目的主目录中创建一个名为 JNI 的文件夹。这个文件夹将包含所有的本地源代码和配置文件。 编写Android.mk文件 这个文件是一个 Makefile&#xff0c;用来指导 NDK 如何编译和构建本地代码。 #清除之前定义的变量&#xff0c;确保每个模块的…

电流采样(分流器与霍尔传感器)

在对于电信号采集的设计中&#xff0c;其中对电流信号的采集是非常常见的&#xff0c;根据电流信号的属性&#xff0c;如信号大小、信号周期等因素&#xff0c;以及采样的需求指标不一样&#xff0c;往往需要选择不同的采样方式进行采样。 下面主要介绍分流器和霍尔元件采样电…

【漏洞复现】号卡极团分销管理系统 ue_serve.php 任意文件上传漏洞

0x01 产品简介 号卡极团分销 管理系统&#xff0c;同步对接多平台&#xff0c;同步订单信息&#xff0c;支持敢探号一键上架&#xff0c;首页多套U|商品下单页多套模板&#xff0c;订单查询支持实时物流信息、支持代理商自定义域名、泛域名绑定&#xff0c;内置敢探号、172平台…

写好的文章怎样联系媒体投稿?

作为单位信息宣传的桥梁,我肩负着将单位的每一次活动、每一项成就转化为社会认可与赞美的重任。初涉此职,我满腔热血,以为凭借扎实的文字功底与不懈的努力,便能在各大媒体平台上为单位赢得一席之地。然而,现实很快就给了我一记响亮的耳光。 我最初采取的是最直接的方式——邮箱…

win10/win11 优先调用大核的电源计划性能设置

前言 大小核&#xff0c;即Intel 12代开始的P-core&#xff08;性能核&#xff0c;一般叫大核&#xff09;和E-core&#xff08;能效核&#xff0c;一般叫小核&#xff09;异核架构。说下个人理解&#xff0c;就是英特尔为了增加cpu性能&#xff0c;但是又因为架构和功耗的限制…

微信小程序上传包过大的最全解决方案!

微信小程序的发布大小限制是2MB。然而一个程序怎么能这么小&#xff1f; 介绍一下项目中的经验。 新项目 如果是刚开始做的新项目&#xff0c;一定确定好自己要用的Ui框架&#xff0c;而且确定之后&#xff0c;千万不要引入别的&#xff0c;否则占大小&#xff01;&#xff0…

人类行为验证处理方案 —— 脱离UI组件库实现登录、注册+表单校验

目录 01: 构建登录模块基础UI结构 02: 表单校验实现原理与方案分析 表单校验的实现原理 自定义表单校验方案分析 文章中的方案实现 03: 基于 vee-validate 实现普适的表单校验 04: 什么是人类行为验证&#xff1f;它的目的、实现原理、构建方案分别是什么&am…

three.js官方案例webgl_loader_fbx.html学习

目录 1.1 添加库引入 1.2 添加必要的组件scene,camera,webrenderer等 1.3 模型加载 1.4 半球光 1.5 动画 1.6 换个自己的fbx模型 1.7 fbx模型和fbx动画关联 1.7 html脚本全部如下 1.8 fbx.js全部脚本如下 1.1 添加库引入 import * as THREE from three; import Stats …

AI重塑了我的工作流

阅读内容 Inhai: Agentic Workflow&#xff1a;AI 重塑了我的工作流 4 种主要的 Agentic Workflow 设计模式 Reflection&#xff08;反思&#xff09;&#xff1a;让 Agent 审视和修正自己生成的输出。 举例&#xff1a;如果有两个 Agent&#xff1a;一个负责 Coding&#…

【加密与解密(第四版)】第十二章笔记

第十二章 注入技术 12.1 DLL注入方法 在通常情况下&#xff0c;程序加载 DLL的时机主要有以下3个&#xff1a;一是在进程创建阶段加载输入表中的DLL&#xff0c;即俗称的“静态输人”;二是通过调用 LoadLibrary(Ex)主动加载&#xff0c;称为“动态加载”&#xff1b;三是由于系…

实现UI显示在最上面的功能

同学们肯定遇到过UI被遮挡的情况&#xff0c;那如何让UI显示在最前面呢&#xff0c;先看效果 原理:UI的排序方式是和unityHierarchy窗口的层级顺序有关的&#xff0c;排序在下就越后显示&#xff0c;所以按照这个理论&#xff0c;当我们鼠标指到UI的时候把层级设置到最下层就好…

小猪APP分发:一站式免费应用推广的理想平台

在日益拥挤的移动应用市场中&#xff0c;对于独立开发者和新兴应用而言&#xff0c;找到一个高效且成本效益高的分发渠道至关重要。这正是小猪APP分发平台www.appzhu.cn脱颖而出的原因&#xff0c;它不仅提供了一个全面的解决方案&#xff0c;帮助开发者免费推广他们的应用程序…

宠物空气净化器终极PK,霍尼韦尔、小米、希喂哪款去浮毛最厉害?

宠物毛发和浮毛问题几乎困扰着每一个热爱动物的家庭。宠物的毛发不仅会附着在家具、地毯和衣物上&#xff0c;还可能引起过敏反应&#xff0c;特别是对于那些对宠物毛发敏感的人来说。此外&#xff0c;宠物毛发还可能携带细菌和尘螨&#xff0c;进一步影响家庭环境的清洁和健康…

【讲解下Web前端三大主流的框架】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

STM32系列(HAL库)——F103C8T6通过HC-SR04超声波模块实现测距

一、模块资料 &#xff08;1&#xff09;模块简介 超声波是振动频率高于20kHz的机械波。它具有频率高、波长短、绕射现象小、方向性好、能够成为射线而定向传播等特点。HC-SRO4是一款尺寸完全兼容老版本&#xff0c;增加UART和IIC功能的开放式超声波测距模块,默认条件下,软件…