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

目录

  • 序言
    • 为什么选择 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Geometry-Aware Attenuation Field Learning for Sparse-View CBCT Reconstruction

摘要&#xff1a; 锥形束CT&#xff08;Cone Beam Computed Tomography&#xff0c;CBCT&#xff09;是目前口腔医学中应用最广泛的一种成像方法&#xff0c;要重建一幅高质量的CBCT图像&#xff0c;需要进行数百次的X线投影&#xff08;即&#xff0c;衰减场&#xff09;在传…

三分钟“手撕”顺序表与ArrayList

前言&#xff1a; 实现顺序表的代码放开头&#xff0c;供大家更好的查阅&#xff0c;每个方法都有代码的实现。 其次我会讲解Java自带的ArrayList的实例&#xff0c;扩容机制ArrayList使用方法&#xff0c;遍历以及它的优缺点。 目录 一、自己实现的顺序表 二、Java的ArrayLi…

基于Pytorch框架的深度学习ShufflenetV2神经网络十七种猴子动物识别分类系统源码

第一步&#xff1a;准备数据 17种猴子动物数据&#xff1a; self.class_indict ["白头卷尾猴", "弥猴", "山魈", "松鼠猴", "叶猴", "银色绒猴", "印度乌叶猴", "疣猴", "侏绒"…

Delphi 开发Android Service四种模式初探

前言&#xff1a; 本篇文章正经来说&#xff0c;其实算是我的学习履历&#xff0c;是我在不断的摸索过程中&#xff0c;总结的经验&#xff0c;不能算是一篇正经的学术文章。现在DELPHI的学习资料太少了&#xff0c;就算是有也都是基于老版本DELPHI&#xff0c;或VCL相关的内容…

AI芯片软件定义硬件架构

软件定义硬件架构 AI 应用正促使芯片制造商和 OEM 重新审视重新配置硬件的可能性。 摩尔定律放缓&#xff0c;软件应用复杂性和规模激增&#xff0c;x86架构CPU运行通用软件的传统方法已无法满足嵌入式和AI应用的高效需求。 在当前x86架构主导的环境中&#xff0c;软硬件间差…

三丰云免费虚拟主机和免费云服务器评测

三丰云是一家专业的云服务提供商&#xff0c;为用户提供免费虚拟主机和免费云服务器服务。通过对三丰云的使用体验&#xff0c;我对他们的服务进行了评测。首先&#xff0c;三丰云的免费虚拟主机性能稳定&#xff0c;网站加载速度快&#xff0c;给用户提供了良好的访问体验。其…

R可视化:另类的箱线图

介绍 方格状态的箱线图 加载R包 knitr::opts_chunk$set(echo TRUE, message FALSE, warning FALSE) library(patternplot) library(png) library(ggplot2) library(gridExtra)rm(list ls()) options(stringsAsFactors F)导入数据 data <- read.csv(system.file(&qu…

数据集005:螺丝螺母目标检测数据集(含数据集下载链接)

数据集简介 背景干净的目标检测数据集。 里面仅仅包含螺丝和螺母两种类别的目标&#xff0c;背景为干净的培养皿。图片数量约420张&#xff0c;train.txt 文件描述每个图片中的目标&#xff0c;label_list 文件描述类别 另附一个验证集合&#xff0c;有10张图片&#xff0c;e…

力扣503. 下一个更大元素 II

Problem: 503. 下一个更大元素 II 文章目录 题目描述思路复杂度Code 题目描述 思路 由于此题是环形数组&#xff0c;我们在利用单调栈模板的基础上还需要将给定数组扩大一倍&#xff0c;但实际上我们只需要利用取余的操作模拟扩大数组即可&#xff08;具体操作看代码。在解决有…

800HZ电源-高频电源行业的明星

一、800Hz电源的简介&#xff1a; 800Hz电源&#xff0c;顾名思义&#xff0c;是一种专为满足通信系统中特定频率要求而设计的电源。通常&#xff0c;800Hz电源具有极高的稳定性和精确度&#xff0c;能提供稳定的电压输出&#xff0c;确保通信设备如交换机、基站、无线路由器等…

【设计模式】JAVA Design Patterns——Commander(指挥官模式)

&#x1f50d;目的 用于处理执行分布式事务时可能遇到的所有问题。 &#x1f50d;解释 处理分布式事务很棘手&#xff0c;但如果我们不仔细处理&#xff0c;可能会带来不想要的后果。假设我们有一个电子商务网站&#xff0c;它有一个支付微服务和一个运输微服务。如果当前运输…

香橙派Kunpeng Pro测评:他给的实在太多了

文章目录 一、开箱环节1、包装配置2、开发板包装3、开发板3.1、开发版正面3.2、开发板背面 二、硬件配置1、硬件配置清单 2、配置图解 三、开机~启动&#xff01;1、运行系统1.1、外设配置1.2、系统启动1.3、官方教程 2、openEuler系统概览 四、系统测试1、性能测试1.1、安装sy…

如何基于springboot构建cas最新版源码?

环境准备 下载JDK21 https://download.oracle.com/java/21/archive/jdk-21.0.2_windows-x64_bin.zip下载gradle 8.5并配置环境变量 https://gradle.org/next-steps/?version8.5&formatbin下载项目git clone http://gitlab.ruishan.cc/meta/anka-authentication.git 开始…

UI问题 --- CardView和其它的控件在同一布局中时,始终覆盖其它控件

原本代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"40dp"android:layout_height"wrap_content"andr…

for循环绑定id,更新html页面的文字内容

需求&#xff1a;将方法中内容对齐 实现方式 给for循环中每个方法添加一个动态的id在DOM结果渲染完后&#xff0c;更新页面数据&#xff0c;否则会报错&#xff0c;找不到对应节点或对应节点为空 <view v-for"(item, index) in itemList" :key"index"…

Java面试八股之Synchronized锁升级的原理

Synchronized锁升级的原理 Synchronized锁升级是Java为了提高并发性能而引入的一项优化措施&#xff0c;这一机制主要发生在JDK 1.6及之后的版本中。Synchronized锁升级旨在减少锁带来的性能开销&#xff0c;通过从低开销的锁逐步升级到高开销的锁&#xff0c;以适应不同的竞争…

Swagger测试接口,请求头添加token

概述Swagger 1、概述 在日常开发中&#xff0c;我们的业务需要用户登录&#xff0c;权限控制。但是在某些情况下我们使用Swagger测试接口&#xff0c;部分接口需要携带token&#xff0c;才能访问&#xff0c;就需要在swagger添加token窗口。 效果图&#xff1a; 由 右上角 A…

统计计算四|蒙特卡罗方法(Monte Carlo Method)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 文章目录 系列文章目录一、基本概念&#xff08;一&#xff09;估算 π \pi π&#xff08;二&…

现代 c++ 三:移动语义与右值引用

移动语义很简单&#xff0c;但它相关联的术语很复杂。本文尝试从历史的角度解释清楚这些乱七八糟的术语及其关联&#xff1a; 表达式 (expression)、类型&#xff08;type&#xff09;、值类别 (value categories)&#xff1b; 左值 (lvalue)、右值 (rvalue)、广义左值 (glval…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第30课-门的移动动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…