使用 GraalVM 构建器从 Spring Boot 应用程序构建本机映像

使用 graalvm 构建器从 spring boot 应用程序构建本机映像

概述

本节介绍如何使用 graalvm 的本机映像生成器从 spring boot 应用程序创建本机映像,以及如何在 docker 容器中运行此本机映像。

客观的

在软件架构和微服务架构设计中,我们必须考虑应用程序的可扩展性、性能。每当应用程序中的请求数量增加时,我们的应用程序应该开始快速扩展并有效地利用资源。

我正在考虑使用 spring boot 提前 (aot) 编译与 graalvm 以及 java 虚拟线程(在 jdk 21 及更高版本中可用)在容器中运行可执行文件。

aot 编译对于快速启动时间和可预测性能很重要的场景是有利的,但代价是运行时适应性较差。与虚拟机 (vm) 相比,容器是轻量级的,使用的资源更少,因为它们共享主机操作系统内核。容器的启动和停止速度比虚拟机快得多,从而实现更快的扩展和部署。虚拟线程可以提高处理大量并发任务的应用程序的性能。这对于 web 服务器、数据库和其他 i/o 密集型系统等应用程序尤其有利。虚拟线程比传统线程使用更少的资源。它们由运行时以最小化内存使用和 cpu 开销的方式进行管理。

在这个架构设计决策中,我们获得了好处,但也必须考虑以下实施挑战和设计注意事项:

虚拟线程:如果我们的业务逻辑是cpu密集型的,比如需要大量内存计算的场景,我们应该避免使用虚拟线程。提前 (aot) 编译:aot 编译器可能无法正确处理反射、代理编码或序列化。此外,graalvm 是一项相对较新的技术,给从 spring boot 应用程序创建本机映像带来了挑战,并导致构建时间增加。容器:容器提供了许多好处,但也带来了一些与安全、网络、性能、ci/cd 等领域相关的挑战。一些示例是 容器可能包含来自基础镜像或依赖项的漏洞。 将容器集成到现有的 ci/cd 管道中可能具有挑战性,需要更改构建、测试和部署流程。管理 kubernetes 等容器编排平台可能很复杂,并且需要专业知识。有效地扩展和缩小容器以处理不同的负载,而不会过度配置或配置不足的资源。

spring boot 应用程序
为了测试这个用例,我正在构建一个 spring boot 应用程序,该应用程序在“/hello”处公开 rest 端点。我正在使用以下配置、库和工具:

带有 rest 的 spring boot 3.2.8 spring boot aot 编译spring boot graalvm 原生镜像maven 3.9.8 构建工具java 22

我们需要在pom xml文件中添加以下配置。

spring boot 属性配置

    22    0.12.1

spring boot aot 插件配置

    org.springframework.boot    spring-boot-maven-plugin                     process-aot                       process-aot                     

graalvm 插件配置

    org.graalvm.buildtools    native-maven-plugin           app-native-binary                 true                        --static --libc=musl          -h:+reportexceptionstacktraces              com.developerhelperhub.tutorial.springboot.tutorial.tutorialstartupperformanceapplication                         add-reachability-metadata                       add-reachability-metadata                     

“mainclass”:配置spring boot应用程序的邮件类”imagename”: 配置原生镜像名称 “buildargs”:配置 —libc=”msul”,我们正在配置 graalvm 以使用“libc musl”兼容库构建本机映像,因为我们将在 alpine linux 机器上运行此映像。与其他标准库相比,musl 的设计更小,使用的内存更少,非常适合资源受限的环境。

构建二进制文件并创建 docker 镜像

我们需要为特定的操作系统主机和cpu架构构建原生镜像,原生镜像将在容器中运行。

我们使用 alpine linux 来在容器中运行我们的应用程序,因为它体积小、简单且安全。为了实现这一点,我们需要使用适当的 graalvm 配置来构建我们的应用程序。 alpine 的系统要求是操作系统和 cpu 架构。

“架构”:“amd64”“os”:“linux”c 通用库:“libc musl”

以下命令我们可以用来检查“amd64/alpine”图像

docker pull amd64/alpine # pull the imagedocker image inspect amd64/alpine # inspect the image

我们可以使用 docker 容器来构建原生镜像,而不用在本地设置 graalvm 和 java 相关配置。我正在使用 “ghcr.io/graalvm/native-image-community:22-muslib” docker 映像来构建本机。

以下命令我们可以用来检查“ghcr.io/graalvm/native-image-community:22-muslib”图像

docker pull ghcr.io/graalvm/native-image-community:22-muslib # pull the imagedocker image inspect ghcr.io/graalvm/native-image-community:22-muslib # inspect the image

我正在创建一个构建映像来测试和调试容器,确保所有配置和服务都正确安装。这种方法将帮助我们快速识别并解决任何问题。

AppMall应用商店 AppMall应用商店

AI应用商店,提供即时交付、按需付费的人工智能应用服务

AppMall应用商店 56 查看详情 AppMall应用商店

在docker文件中添加以下步骤,文件名为“dockerfilebuild”

from ghcr.io/graalvm/native-image-community:22-muslib as build# install necessary toolsrun microdnf install wget run microdnf install xz# install maven for build the spring boot applicationrun wget https://dlcdn.apache.org/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gzrun tar xvf apache-maven-3.9.8-bin.tar.gz# set up the environment variables needed to run the maven command.env m2_home=/app/apache-maven-3.9.8env m2=$m2_home/binenv path=$m2:$path# install upx (ultimate packer for executables) to compress the executable binary and reduce its size.run wget https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-amd64_linux.tar.xzrun tar xvf upx-4.2.4-amd64_linux.tar.xz# set up the environment variables required to run the upx command.env upx_home=/app/upx-4.2.4-amd64_linuxenv path=$upx_home:$path#copy the spring boot source code into containerrun mkdir -p /app/spring-boot-rest-api-appcopy spring-boot-rest-api-app /app/spring-boot-rest-api-app#compile the native imagerun cd /app/spring-boot-rest-api-app && mvn -pnative native:compile#compressed binary filerun upx -7 -k /app/spring-boot-rest-api-app/target/app-native-binaryworkdir /appentrypoint ["/bin/bash"]

我在构建过程中使用 upx 压缩工具来减小图像大小,upx 通常会将程序和 dll 的文件大小减小约 50%-70%,从而减少磁盘空间、网络加载时间、下载时间等配送和存储成本。

使用以下命令构建 docker 镜像。

docker build --no-cache -f dockerfilebuild -t alpine-graalvm-build .

构建完成后,镜像大小为1.85 gb。

repository                               tag         image id       created          sizealpine-graalvm-build                     latest      81d23bc1bc99   36 seconds ago   1.85gb

我们可以在 alpine linux 盒子内创建较小的容器之前验证容器内的配置和安装。以下命令将允许我们进入容器:

docker run --rm -it --entrypoint /bin/bash alpine-graalvm-buildjava --version #verify the java versionmvn --version #verify the maven versionupx --version #verify the upx versionls /app/spring-boot-rest-api-app/target/app-native-binary #verify the binary available/app/spring-boot-rest-api-app/target/app-native-binary #run the executable

我们知道这个原生镜像包含独立运行二进制文件所需的所有依赖项,而不需要任何与构建相关的工具,例如 graalvm、maven、upx 或源代码。我们可以使用 docker 多阶段构建方法将构建文件复制到我们的应用程序映像中。通过使用多个阶段,您可以将构建环境与运行时环境分开。这意味着最终图像中仅包含必要的工件,从而显着减小其尺寸。

在docker文件中添加以下步骤,文件名为“dockerfilebuildandcreatealpinecontainer”

from ghcr.io/graalvm/native-image-community:22-muslib as build# install necessary toolsrun microdnf install wget run microdnf install xz# install maven for build the spring boot applicationrun wget https://dlcdn.apache.org/maven/maven-3/3.9.8/binaries/apache-maven-3.9.8-bin.tar.gzrun tar xvf apache-maven-3.9.8-bin.tar.gz# set up the environment variables needed to run the maven command.env m2_home=/app/apache-maven-3.9.8env m2=$m2_home/binenv path=$m2:$path# install upx (ultimate packer for executables) to compress the executable binary and reduce its size.run wget https://github.com/upx/upx/releases/download/v4.2.4/upx-4.2.4-amd64_linux.tar.xzrun tar xvf upx-4.2.4-amd64_linux.tar.xz# set up the environment variables required to run the upx command.env upx_home=/app/upx-4.2.4-amd64_linuxenv path=$upx_home:$path#copy the spring boot source code into containerrun mkdir -p /app/spring-boot-rest-api-appcopy spring-boot-rest-api-app /app/spring-boot-rest-api-app#compile the native imagerun cd /app/spring-boot-rest-api-app && mvn -pnative native:compile#compressed binary filerun upx -7 -k /app/spring-boot-rest-api-app/target/app-native-binaryworkdir /app#second stage: create the runtime imagefrom amd64/alpine#set the working directoryworkdir /app#copy the built application from the first stagecopy --from=build /app/spring-boot-rest-api-app/target/app-native-binary .#expose port which our spring boot application is runningexpose 8080 #command to run the applicationentrypoint ["/app/app-native-binary"]

使用以下命令构建 docker 镜像。

docker build -f dockerfilebuildandcreatealpinecontainer -t alpine-graalvm .

构建完成后,容器镜像大小为32.8mb。

repository                               tag         image id       created          sizealpine-graalvm                           latest      79676c696920   11 seconds ago      32.8mb

我们可以验证容器。

docker run --rm -it --entrypoint sh alpine-graalvmls /app #verify the binary available/app/app-native-binary #run the executable

应用程序启动时间仅为 0.074 秒,而在 jvm 上运行的典型 spring boot 应用程序的启动时间约为 1.665 秒。

started tutorialstartupperformanceapplication in 0.074 seconds (process running for 0.075)

以下命令可用于运行 docker 容器来运行应用程序

docker run -d --name test-app -p 8080:8080 alpine-graalvm #run the containercurl http://localhost:8080/hello # checking the endpoints

spring boot 和 graalvm 参考

spring boot 介绍 graalvm 原生镜像graalvm 文档构建 spring boot native executablegraalvm maven 插件文档使用 graalvm 设置 spring boot 应用程序 docker 镜像示例使用 spring boot 和 graalvm 的示例本机映像spring boot 3.2.8 graalvm 原生镜像文档spring boot graalvm upx 教程视频 spring boot alpine linux docker 本机镜像示例## docker 和 graalvm 参考资料graalvm 容器镜像docker 环境变量下载 upx 文档upx 发布docker stop 容器

源代码

spring boot github 存储库kubernetes 相关仓库

以上就是使用 GraalVM 构建器从 Spring Boot 应用程序构建本机映像的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/501423.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 20:40:17
下一篇 2025年11月8日 20:41:19

相关推荐

  • 加密资产,技术股票和市场扩张:一个新时代?

    分析加密资产、技术股票与市场扩张的交汇点,洞察金融格局的潜在变革。 加密资产、技术股票与市场扩张:迈向新时代? 金融领域正经历加密资产、科技股以及整体市场扩展三者交汇带来的深刻影响。我们是否正处于一场重大变革的前夜? Coinbase的领导地位:机构采纳的关键信号 Coinbase作为行业领军者的地…

    2025年12月8日
    000
  • 灰度数字大盘最新持仓曝光:BTC占比下滑,山寨币机会浮现?

    灰度投资调整数字大盘基金持仓,比特币占比下降,以太坊及山寨币占比上升。1. 灰度Q2报告显示,BTC持仓比例由68.5%降至62.3%,ETH上升至28.1%,SOL及其他山寨币也有所增加;2. 调整原因包括比特币ETF竞争加剧导致资金流出、ETH ETF预期推动资金流入以及山寨币市场活跃吸引机构配…

    2025年12月8日
    000
  • Breed风投紧急预警:198家企业比特币储备达470亿美元 暴跌或触发连环清算

    从微策略(Strategy)到新创小型股,2025年已有超过250家机构把比特币(BTC)当作「企业现金」。 这股BTC库藏股热潮挑战传统财务框架的同时,也埋下高杠杆的隐忧。 风险投资公司Breed报告直指:若BTC转跌,许多企业可能陷入融资枯竭的死亡螺旋。 ‍ 热潮如何成形? 通膨的高涨与法币信任…

    2025年12月8日
    000
  • Metaplanet的比特币大富翁:从默默无闻到前五名!

    metaplanet的比特币积极战略助其跃居前五大公司持有者之列,超越了cleanspark,甚至引发了saylor的关注。这是企业财务的新方向吗? Metaplanet的比特币大冒险:从无名小卒到前五强! 让开,MicroStrategy!新的比特币巨头登场了。作为亚洲对标MicroStrateg…

    2025年12月8日
    000
  • 灰度数字大盘是什么意思

    灰度数字大盘是指灰度投资旗下数字资产信托基金的整体表现,其核心包含单一资产信托和复合型基金。1.“灰度”指Grayscale Investments,旗下有GBTC、ETHE等信托产品;2.“数字大盘”狭义指追踪主流加密资产的GDLC基金,广义则涵盖灰度所有信托产品整体表现。关注灰度数字大盘的原因包…

    2025年12月8日
    000
  • Reserve Rights Token(RSR)币是什么? RSR协议如何铸造RSV稳定币?

    目录 什么是Reserve Rights Token (RSR)?Reserve Rights Token (RSR) 如何运作?RSR 币的创始人是谁?RSR 币的独特之处是什么?RSR 币的价值来自哪里?RSR 币流通量是多少?RSR 币的其他技术数据 影响RSR币价格的因素RSR币价格预测20…

    2025年12月8日
    000
  • Ripple的$ RLUSD和Stablecoin Boom:有什么交易?

    探索ripple $ rlusd stablecoin的飙升,对以太坊生态的影响以及defi中stablecoin热潮的深远意义。 Ripple的$ RLUSD与Stablecoin交易:背后隐藏了什么? Ripple推出的稳定币$ RLUSD正引发广泛关注。自2025年年初以来,其供应量增长了四倍…

    2025年12月8日
    000
  • 雪崩价格预测:灰度提升信号潜在集会到50美元?

    雪崩(avax)因其不断增强的链上活跃度与机构关注度正逐步升温,其价格是否有望冲高至50美元?我们来看看最新的价格预测和市场动向。 雪崩价格展望:灰度背书预示或将冲击50美元? 雪崩(AVAX)展现出强劲的韧性,吸引了越来越多机构的关注,并在链上活动方面表现突出。这是否意味着一场大规模上涨即将到来?…

    2025年12月8日
    000
  • PI网络,新功能和PI2DAY:它会恢复Pi硬币吗?

    pi network在pi2day之前推出了新功能,包括ai集成和生态系统积分,但这些更新能否扭转pi coin近期的价格下跌趋势? PI网络、新功能与PI2DAY:是否能重振Pi币价值? 随着PI2DAY的临近,PI网络正引发热议,社区中充满了期待与疑问。AI整合、生态系统积分以及KYC流程的优化…

    2025年12月8日
    000
  • 锚地,稳定币和脱口秀:加密戏剧中的纽约分钟

    anchorage digital的stablecoin剔除举动引发争议。是出于监管审慎,还是背后隐藏自我利益?我们深入解析锚地、稳定币以及下架风波。 锚地、稳定币与退市风波:加密世界的一出大戏 Anchorage Digital决定剔除部分Stablecoin,此举在加密圈掀起了轩然大波,不仅引发…

    2025年12月8日
    000
  • 锚固,稳定和法规:纽约的潮汐视角

    安克雷奇(Anchorage)摆脱了有关Stablecoin安全,监管和市场机会的辩论。这是监管的必要性还是战略性游戏? Stablecoins的世界总是在嗡嗡作响,最近,Anchorage Digital逐步支持USDC的决定确实引起了锅的刺激。此举提出了一些有关Stablecoin安全性,不断发…

    2025年12月8日
    000
  • 云采矿:您获得财务自由和加密奖励的门票?

    探索hashj与miningtoken等云采矿平台如何通过加密货币奖励实现财务自由。这些机会是否真实可行? 云采矿:通往财务自由与加密奖励的途径? 云挖矿正变得炙手可热,承诺通过加密货币奖励实现财务自由。Hashj和MiningToken等平台正迅速崛起,但它们真的可靠吗?我们来深入了解。 云采矿的…

    2025年12月8日
    000
  • 加密股票激增:硬币,Mara,clsk和Altcoin国库革命

    coin、mara与clsk等美国加密资产正吸引着投资者的目光。一些公司开始多元化布局山寨币,引发了“美国上市altcoin热潮”。 加密股票飙升:Coin、Mara、clsk与Altcoin国库革新 加密市场正在升温,相关的数字资产也在同步上涨!像Coinbase(Coin)、Marathon D…

    2025年12月8日
    000
  • 7月要观看的十大加密投资:超越通常的嫌疑人

    探索7月有潜力的加密投资,超越sol和xrp等主流币种,寻找潜在的高增长机会。 7月值得关注的十大加密投资:不止于主流币种 随着7月的到来,加密市场正蓄势待发。虽然主流币种依然稳健,但精明的投资者正在挖掘那些被低估的代币,以寻求更高的回报。今年7月,关键在于跳出常规思维,发现具备不对称收益潜力的项目…

    2025年12月8日
    000
  • Vinanz,比特币,控股:解码最新动作

    探索vinanz的比特币积累策略,最新的买入动向及其对持有比特币企业格局的深远影响。 Vinanz,比特币,持仓:解析最新动态 Vinanz Limited(LSE:BTC)正在数字资产领域掀起波澜。凭借对比特币的持续增持和对财务透明的高度关注,我们来剖析其最近的行动以及对企业持有比特币这一趋势的潜…

    2025年12月8日
    000
  • 比特币持有,加密货币和Vinanz:数字资产的纽约分钟

    探索vinanz等公司的发展轨迹,比特币进入企业金库的趋势,以及这对数字金融未来的深远影响。#bitcoin #cryptotreasury #vinanz 金融领域从不乏味,尤其是当加密货币成为其中一员时。最近,围绕企业全面布局比特币及其他数字资产的讨论热度不断上升。我们来剖析一下主要参与者及其在…

    2025年12月8日
    000
  • TRON(TRX)价格和费用调整:是什么驱动了动态?

    看看tron的trx价格、费用调整和网络活动。探索关键趋势与洞察,揭示trx在加密市场中的表现。 TRON(TRX)价格与费用变化:背后的推动力是什么? Tron的TRX经历了显著的价格波动以及策略性的费用调整。本文深入分析了影响这些变化的关键因素,为关注Tron生态的用户提供了详尽的解读。 Tro…

    2025年12月8日
    000
  • 系绳,加密和投资基金:一个新时代?

    探索系绳、加密投资基金与数字世界演进的交汇点。 系绳、加密和投资基金:迈向新纪元? 加密货币领域持续演变,由Tether、加密投资基金以及AI代理共同引领这一浪潮。让我们深入探讨最新的进展及其对未来可能带来的影响。 Tether的蓝图:万亿AI代理交易加密资产 Tether首席执行官Paolo Ar…

    2025年12月8日
    000
  • 加密ICO,比特币和投资:导航2025年景观

    探索crypto ico、比特币复苏以及2025年投资策略的最新动向。揭示了具有潜力的项目和聪明投资者的重要洞见。 加密货币市场在2025年6月的活动中持续活跃,比特币在全球事件中维持超过107,000美元的价格高位。投资者密切关注新的机会,尤其是那些提供现实应用价值和创新早期参与机制的项目。让我们…

    2025年12月8日
    000
  • 以太坊,比特币和加密市场:导航中性潮汐

    加密货币市场正呈现出中性价格走势。以太坊正在重新挑战2500美元关口,而比特币则处于盘整阶段。深入解析当前趋势与关键见解。 以太坊、比特币与加密市场:穿越中性波动 近期加密货币市场略显冷静,整体氛围趋于中性。让我们来梳理一下以太坊、比特币以及整个加密市场的现状。 以太坊的积极反弹 以太坊展现出一定的…

    2025年12月8日
    000

发表回复

登录后才能评论
关注微信