以GraalVM原生镜像的方式运行Spring Boot应用程序

Spring Boot &GraalVM–系列共有3个部分:

  • 第1部分:以GraalVM原生镜像运行Spring Boot应用程序
  • 第2部分:使用Docker&Heroku容器运行Spring BootGraalVM原生镜像
  • 第3部分:使用原生镜像maven插件简化Spring Boot GraalVM原生镜像构建

Spring Boot变GraalVM

在我去年的一个项目中,我遇到了一个使用Spring Boot的情况。这个想法是在Kubernetes上运行所有的微服务,而Java(更准确地说:Spring Boot)被称为太慢太胖了。那时候我真的不得不吞下这片药片,感觉不太好。

这个话题我已经琢磨了很久了!在过去的一年里,随着我越来越多地将注意力转移到DevOps的话题上,我没有时间真正做点什么。但我从未真正离开过Spring的世界。随着2020年的开始,我准备回来看看这个领域是否有新的发展。

而且还有!2019年Spring一号站台,安迪·克莱门特和Sébastien Deleuze就如何将Spring Boot应用程序作为GraalVM本机映像运行进行了一次精彩的演讲。两者还推动了关于GitHub上GraalVM支持的Spring实验项目,在那里您可以密切关注每一步的进展。我想亲爱的斯塔布克斯曼真的推了安迪和Sébastien将发布他们在SpringMilestonesMaven存储库上的工作,这样他就可以写关于SpringTips的介绍(但我相信他会在Twitter上澄清)。但要明确的是,所有想马上开始使用Spring&GraalVM的人:

随着SpringFramework计划于2020年秋季发布的5.3版本,可以预期对SpringBoot提供稳定的GraalVM本机映像支持。

但这不应妨碍我们得到我们的手上这个新的有前途的功能!我真的努力为Spring扫清障碍, Java对于Kubernetes来说太慢太胖了

GraalVM原生镜像和Spring Boot

最近有很多关于GraalVM的传言。codecentric博客还提供了一些阅读内容:Enno Lohmann对Quarkus.io的介绍,或者Timo Kockert对GraalVM的介绍(抱歉,仅限德语)。所以我不会在这里过多地挖掘它的秘密。但是由于GraalVM是许多项目的保护伞,我们需要在这里关注一个特殊的子项目: GraalVM Native Image 。由于我们希望减少Spring Boot应用程序的启动时间和内存占用,所以我们将关注这个项目。

GraalVM原生镜像(或本机映像)的配置主要有两种方式:通过JSON文件进行静态配置或通过动态配置。静态配置文件可以手工制作或在Graal原生映像代理的帮助下生成。动态配置能够处理更复杂的情况。这里可以实现一个特殊的通用特性接口。在GraalVM本机映像构建过程中,实现此接口的类将被回调。

通过将传统上在运行时发生的动态魔法转移到本机映像的编译阶段,可以极大地减少Java应用程序的启动时间和内存占用。当我们考虑在普通Java应用程序中使用一点反射时,这已经是一项很重要的工作,当我们考虑Spring时,这将变得更加困难。它的银弹是它最大的缺点,同时当谈到原生映像生成。尽管类路径扫描和“神奇的”自动配置使我们作为开发人员的生活变得更加轻松,但是 GraalVM原生映像构建过程需要处理它

但是Spring团队真的接受了这个大挑战!安迪·克莱门特和Sébastiendeleuze已经作为一个实验项目为Spring提供了一个Graal@AutomaticFeature的实现。现在已经有大量的示例Spring项目使用这个特性来创建GraalVM原生图像。我发现这真是太棒了,真想仔细看看!

用SDKMAN安装GraalVM

别说了!让我们开始吧。正如有倾向的读者已经知道的那样,我总是努力写100%易懂的博客文章。希望这里的这个也不例外,因此您可以在GitHub上找到一个示例项目: https://github.com/jonashackt/spring-boot-graalvm

为了使用GraalVM,我们需要做的第一件事就是安装它。多亏了我的同事克里斯托夫·达尔斯基,我最近才真正喜欢上了SDKMAN。您可以使用它管理jdk和Java工具,比如Maven或GraalVM。为了使用SDKMAN,我们需要在本地安装它:

curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"

如果SDKMAN已经成功安装,那么 sdk list java 命令应该显示SDKMAN能够安装的所有可能的jdk:

$ sdk list java
 
================================================================================
Available Java Versions
================================================================================
 Vendor        | Use | Version      | Dist    | Status     | Identifier
--------------------------------------------------------------------------------
 AdoptOpenJDK  |     | 14.0.0.j9    | adpt    |            | 14.0.0.j9-adpt
               |     | 14.0.0.hs    | adpt    |            | 14.0.0.hs-adpt
               |     | 13.0.2.j9    | adpt    |            | 13.0.2.j9-adpt
... 
 GraalVM       |     | 20.1.0.r11   | grl     |            | 20.1.0.r11-grl
               |     | 20.1.0.r8    | grl     |            | 20.1.0.r8-grl
               |     | 19.3.1.r11   | grl     |            | 19.3.1.r11-grl
...

列表本身要长得多,您可以看到这种方法的奇妙的简单性: 永远不要再弄乱JDK安装! 现在要安装基于JDK11的GraalVM,只需运行:

sdk install java 20.1.0.r11-grl

SDKMAN现在为我们安装GraalVM。要正确配置PATH变量,可能需要重新启动控制台。如果一切顺利,您应该看到 java-version 输出如下:

$ java -version
openjdk version "11.0.7" 2020-04-14
OpenJDK Runtime Environment GraalVM CE 20.1.0 (build 11.0.7&
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值