【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/applicationEXPOSE 8080
USER 1001CMD ["./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 /workEXPOSE 8080
USER 1001CMD ["./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.mzph.cn/diannao/17259.shtml

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

相关文章

M功能-open feign的使用-支付系统(四)

target&#xff1a;离开柬埔寨倒计时-219day 这张图片一直是我idea的背景图&#xff0c;分享出来啦… 前言 支付平台使用的是基于springcloud的微服务&#xff0c;服务之间的调用都是使用openfeign&#xff0c;而我们每个服务对外暴露的接口响应都会在外部封装一层code之类的信…

在Bash中解析命令行参数的两种样例脚本

文章目录 问题回答以空格分隔选项和参数以等号分隔选项和参数 参考 问题 假设&#xff0c;我有一个脚本&#xff0c;它会被这样一行调用: ./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile或者这个&#xff1a; ./myscript -v -f -d -o /fizz/someOtherFile ./fo…

【NumPy】NumPy实战入门:索引与切片(sort、argsort、searchsorted)详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

[NOIP 2014] 寻找道路

[NOIP 2014] 寻找道路 在有向图 G 中&#xff0c;每条边的长度均为 11&#xff0c;现给定起点和终点&#xff0c;请你在图中找一条从起点到终点的路径&#xff0c;该路径满足以下条件&#xff1a; 路径上的所有点的出边所指向的点都直接或间接与终点连通。在满足条件 11 的情…

全局查询筛选器适用场景 以及各场景示例

EF Core中的全局查询筛选器&#xff08;Global Query Filters&#xff09;是一种强大的功能&#xff0c;可以在实体框架的DbContext级别为特定的EntityType设置默认的过滤条件。这些筛选器自动应用于所有涉及到相关实体的LINQ查询中&#xff0c;无论是直接查询还是通过Include或…

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

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

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

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

学习图形推理

学习图形推理 1.位置规律1.1平移1.2翻转、旋转2.样式规律2.1加减异同2.2黑白运算3.属性规律3.1对称性3.2曲直性3.3开闭性4.数量规律4.1面4.2线数量4.3笔画数4.4点数量4.5素数量5.空间重构5.1相对面5.2相邻面-公共边5.3相邻面-公共点5.4相邻面-画边法题型 一组图:从左往右找规律…

编程-辅助工具-Git下载

文章目录 1、前言2、Git官网地址3、迅雷下载 1、前言 采用Git能下载github上的代码&#xff0c;其下载是采用官网下载的&#xff0c;但是下载速度比较慢&#xff0c;网上也推荐了镜像的方式&#xff0c;但是有些链接失效了&#xff0c;突然有一天想起用迅雷是不是合适&#xf…

DDR基本原理

1. 简介 DDR SDRAM&#xff08;Double Data Rate Synchronous Dynamic Random Access Memory&#xff0c;双数据率同步动态随机存储器&#xff09;通常被我们称为DDR&#xff0c;其中的“同步”是指内存工作需要同步时钟&#xff0c;内部命令的发送与数据传输都以它为基准。DDR…

【社会信用体系1003】 企业违规新解:社会信用环境改善的实证分析!

今天给大家分享的是来自于国内顶级期刊金融研究2023年发表论文——《社会信用环境改善降低了企业违规吗&#xff1f;——来自“中国社会信用体系建设”的证据》所用到的重要数据集&#xff0c;该文章从企业层面探讨了社会信用系统建设对企业违规行为的影响&#xff0c;更精准地…

牛客NC164 最长上升子序列(二)【困难 贪心+二分 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/4af96fa010c44638a7e112abf65f7237 思路 贪心二分 所谓贪心&#xff0c;就是往死里贪&#xff0c;所以对于最大上升子序列&#xff0c;结尾元素越小&#xff0c;越有利于后面接上其他的数&#xff0c;也就可能变…

使用 Elasticsearch 作为 Azure OpenAI On Your Data 的向量数据库

作者&#xff1a;来自 Elastic Paul Oremland 背景介绍 最近&#xff0c;微软通过 Azure OpenAI 服务 "On Your Data" 将 Elasticsearch 直接集成到 Azure 中。"On Your Data" 使组织能够利用强大的 AI 模型&#xff08;如 GPT-4 和 RAG 模型&#xff09;…

想知道期权的交易方式有哪些吗?新手必看!

今天期权懂带你了解想知道期权的交易方式有哪些吗&#xff1f;新手必看&#xff01;期权指投资者在支付了一定的权利金之后&#xff0c;将拥有未来某个时间协定价格买入或者卖出的权利。 期权的交易策略方式有哪些&#xff1f; 买入看涨期权&#xff1a; 使用场景&#xff1a…

C# WPF入门学习主线篇(四)—— Button的常用属性

本期来详细介绍一下WPF中Button组件的属性都有哪些 一、准备阶段 首先&#xff0c;打开我们之前创建好的工程。 这是我们之前几期一起做过的工程&#xff0c;现在重新创建一个button&#xff0c;来熟悉一下他的属性。 选中创建的button&#xff0c;点击属性栏 二、接下来介绍…

layui扩展件(xm-select)实现下拉框

layui扩展件&#xff08;xm-select&#xff09;实现下拉框 扩展组件 xm-select 效果图 html代码 <div class"layui-inline"><label class"layui-form-label">职位</label><div class"layui-input-inline" style"wid…

小皮面板中访问不了本地的sqli网站---解决方法

今天想在sqli-labs中做题&#xff0c;却发现自己访问不了网站 1、具体的错误原因如下 2、查了一下&#xff0c;可能是因为自己访问的域名不对 3、修改了域名为&#xff1a;http://sqli-labs:81/Less-2/便可以访问了 4、然后接下来我有遇到一个错误&#xff0c;这个问题是php版…

【onnx问题解决】关键词:found at least two devices、torch.onnx.export

关键词&#xff1a;Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! 报错&#xff1a; [34m[1mONNX:[0m export failure ❌ 3.8s: Expected all tensors to be on the same device, but found at least two devices, cpu an…

Amazon云计算AWS之[7]内容推送服务CloudFront

文章目录 CDNCDN简介CDN网络技术 CloudFrontCloudFront基本概念 CDN CDN简介 用户在发出服务请求后&#xff0c;需要经过DNS服务器进行域名解析后得到所访问网站的真实IP&#xff0c;然后利用该IP访问网站。在这种模式中&#xff0c;世界各地的访问者都必须直接和网站服务器连…

openflow协议抓包分析

1、准备实验拓扑&#xff1a; 在Mininet环境中创建一个简单的SDN拓扑&#xff0c;包括控制器、交换机、主机等。 确保拓扑能够正常运行&#xff0c;SDN交换机与控制器建立连接。 采用主机Ubuntu22.04主机&#xff0c;IP地址是192.168.87.130&#xff0c;安装opendaylight控制…