使用 Spring Boot 和 GraalVM 实现原生(系列一)

举报
小云悠悠zZ 发表于 2023/01/30 15:48:51 2023/01/30
【摘要】 Java主导着企业应用程序。但在云中,Java比一些竞争对手更昂贵。使用GraalVM进行本机编译使云中的Java更便宜:它创建的应用程序启动速度更快,使用更少的内存。因此,原生编译给所有 Java 用户带来了许多问题:原生 Java 如何改变开发?我们什么时候应该切换到原生Java?我们什么时候不应该?我们应该为原生Java使用什么框架?本系列文章将和大家一起来讨论这些问题。 

关键要点

  • Spring Boot 3 和 Spring Framework 6 将于 2022 年底推出,将内置对原生 Java 的支持。
  • 对于Spring Framework 5.x和Spring Boot 2.x用户来说,Spring Native是最好的选择。
  • Spring Native 为庞大的库生态系统提供了集成。
  • 但是 Spring Native 还提供了一个组件模型,允许您扩展对其他库的本机编译支持。
  • GraalVM AOT编译提供了很多可能性,但有一些(可协商的)成本。
Java主导着企业应用程序。但在云中,Java比一些竞争对手更昂贵。使用GraalVM进行本机编译使云中的Java更便宜:它创建的应用程序启动速度更快,使用更少的内存。因此,原生编译给所有 Java 用户带来了许多问题:原生 Java 如何改变开发?我们什么时候应该切换到原生Java?我们什么时候不应该?我们应该为原生Java使用什么框架?本系列文章将和大家一起来讨论这些问题。 

Java 社区

你知道,Java是一个很棒的生态系统,很难列出它非常适合的所有东西。这个清单似乎无穷无尽。但至少要说出一些疣也不是那么困难。正如本系列文章中的文章所示,在 JRE 上运行的应用程序通常需要 10 秒或更长时间才能启动,并且需要数百兆或千兆字节的内存。

这种表现并不是当今世界最好的前锋。有新的领域,新的机遇:功能即服务产品。容器化和容器业务流程协调程序。它们有一个共同点:启动速度和内存占用很重要。

Go, Go, GraalVM!

GraalVM提供了一条前进的道路,但需要一些成本。GraalVM 是一个直接的 OpenJDK 替代品,带有一个额外的实用程序(称为本机映像),支持提前 (AOT) 编译。

Native Image 会查看您的源代码并确定所有可访问的代码 — 您可以通过调用或使用链接到您的代码。其他所有内容,无论是在应用程序的类路径中还是在 JRE 中,都是不必要的,并且被丢弃。

当您执行本机映像无法确定遵循的操作时,麻烦就来了。毕竟,Java是一种非常动态的语言。可以创建一个 Java 应用程序,该应用程序在运行时将字符串编译为文件系统上的有效 Java 类文件,将其加载到 ClassLoader 中,然后以反射方式创建它的实例或从中创建代理。可以将该实例序列化到磁盘,然后将其加载到另一个 JVM 中。无需链接到比 !但是,如果类型不在本机可执行堆中,则所有这些在本机 Java 中都不起作用。java.lang.Object

然而,一切都没有丢失。您可以告诉 Native Image 要在配置文件中保留哪些类型,这样,如果您决定在运行时执行反射、代理、类路径资源加载、JNI 等操作,它仍然可以工作。

现在Java和Spring生态系统是巨大的。配置所有内容可能会非常痛苦!所以有两种选择:1)教导Spring尽可能避免其中一些机制,或者2)教导Spring尽可能多地提供配置文件。这个配置文件必然包括 Spring 框架和 Spring Boot,在某种程度上,还包括 Spring Boot 支持的第三方集成。

Spring Native

Spring 团队在 2019 年启动了 Spring Native 项目,该项目将原生可执行编译引入 Spring Boot 生态系统。它已成为几种不同方法的研究床。但是Spring Native并没有从根本上改变Spring Framework 5.x或Spring Boot 2.x。这不是终点,只是漫长旅程的第一步:它已经为下一代 Spring Framework (6.x) 和 Spring Boot (3.x) 证明了许多概念,两者都将于 2022 年晚些时候推出。这些新一代可以做更多的优化,所以未来看起来很光明!由于这些版本尚未发布,我们将在本文中介绍Spring Native。

Spring Native 转换发送到 Native Image 的源代码。例如,Spring Native 将服务加载器机制转换为静态类,生成的 Spring Native 应用程序知道要查阅这些静态类。它还将所有Java配置类(那些注释为)转换为Spring的功能配置,从而消除了应用程序及其依赖项的大量反射。spring.factories@Configuration

Spring Native 还会自动分析您的代码,检测需要 GraalVM 配置的场景,并以编程方式提供它。Spring Native 附带了 Spring & Spring Boot 和第三方集成的提示类。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。