Spring官宣,干掉原生JVM,推出 Spring Native!

Spring 团队日前发布了 Spring Native Beta 版。通过 Spring Native,Spring 应用将有机会与 GraalVM 原生镜像的方式运行。为了更好地支持原生运行,Spring Native 提供了 Maven 和 Gradle 插件,并且提供了优化原生配置的注解。

Spring 发布了 Spring Native 的 beta 版本,并在start.spring.io上运行它。

实际上,这意味着自Spring成立以来,除了Spring支持的常规Java虚拟机之外,我们还将添加Beta支持,以使用GraalVM将Spring应用程序编译到本机映像中,从而提供一种部署Spring应用程序的新方法。支持Java和Kotlin。

这些本机Spring应用程序可以部署为独立的可执行文件(无需安装JVM),并提供有趣的特性,包括几乎即时启动(通常<100ms),即时峰值性能和较低的内存消耗,但所需的构建时间和运行时优化次数少于JVM。

使用简单mvn spring-boot:build-imagegradle bootBuildImage命令,您可以生成一个优化的容器映像,该映像将包含一个最小的OS层和一个小的本机可执行文件,该映像仅随附JDK,Spring以及您在应用程序中使用的依赖项中的必需位。请参阅下面的示例,其中包含50MB可执行文件的最小容器映像,其中包含Spring Boot,Spring MVC,Jackson,Tomcat,JDK和应用程序。

这种原生方式,在很多场景下都会对 Spring 应用产生价值:

  • 具有Spring Cloud功能的无服务器
  • 以更便宜和更可持续的方式托管Spring微服务
  • 非常适合VMware Tanzu等Kubernetes平台
  • 想要创建最佳的容器映像来打包您的Spring应用程序和服务

在使用场景上,比如 Piotr Mińkowski 提供了一个非常棒的指南,介绍了如何在 Knative 上使用 Spring Boot 和 GraalVM 构建原生微服务。

1. 团队协作

Spring Native beta 是整个 Spring 团队及其家族项目广泛合作的结果:Spring Framework、Spring Boot 还包括 Spring Data、Spring Security、Spring Cloud 和 Spring Initializr。

据悉,原生功能的工作范围比 Spring 更广,因为原生涉及到更广泛的 JVM 生态系统,所以官方一直在与 GraalVM 团队合作,以改善原生镜像的兼容性和资源消耗。

以下是来自 GraalVM 团队的 Vojin Jovanovic 的一段话。

“与 Spring 团队协作打造原生 JVM 生态系统是一件非常愉快的事情:他们深厚的技术知识,再加上对社区的敏感触觉,总是能带来最好的解决方案。最新的 Spring Native 版本,以及它在 JVM 生态系统中的众多用法,为原生编译的广泛采用铺平了道路。”

2.支持范围

随着Spring Native从alpha过渡到beta,我认为弄清我们提供的支持范围很重要。

Alpha是第一步,我们进行了大量试验并完善了Spring Native(以前称为Spring GraalVM Native)的体系结构,兼容性和对一系列样本进行了重大更改的封装。我们还报告了GraalVM团队修复的许多问题,目的是缩小JVM与Spring应用程序的本机之间的差距。

虽然仍被认为是实验性的,但beta意味着Spring现在为Spring生态系统的子集提供了对native的支持。如果项目正在使用受支持的依赖项,则可以在项目上进行尝试;如果出现问题,则引发错误或提出请求请求。最新版本的Spring Boot 2.x次要版本的每个修补程序版本都会出现一个新版本的Spring Native。Spring Native 0.9.0支持Spring Boot 2.4.3,Spring Native 0.9.1支持Spring Boot 2.4.4,等等。虽然会发生一些重大变化,但我们将记录迁移路径。文档质量达到了一个新的水平:参考文档以html单页或pdf的形式提供],并且我们发布了本机提示的Javadoc公共API。

3.start.spring.io

Stéphane Nicoll 在对 start.spring.io 和相关 IDE 的集成中,引入了对 Spring Native 的支持,所以现在这是探索如何使用 Spring 构建原生应用最简单的方式。

添加 Spring Native 依赖后将会使用所需的依赖和插件自动配置 Maven 或 Gradle 项目,以便于支持原生。应用代码本身没有变化。

请检查自动生成的 HELP.md 文件,该文件包含了有用的链接和文档,同时它还能标记出来你是否选择了一些在原生环境下不支持的依赖。

4 .提前转换

本机不同于JVM:类路径在构建时是固定的,例如需要反射或资源进行配置,没有类延迟加载(可执行文件中附带的所有内容在启动时都加载到内存中),并且可以调用一些代码在构建时。

为了充分体现这些特性并允许Spring应用程序在本机上以最大的兼容性和最小的占用空间运行,Brian Clozel在此版本中引入了Spring提前(AOT)Maven和Gradle插件,它们可以提前执行您的应用程序上的转换。

第一种转换旨在基于由惊人的Andy Clement设计和实现的推理引擎来生成GraalVM本机配置(反射,资源,代理,本机映像选项),该引擎了解什么是Spring编程模型和基础架构。例如,对于每个由注释的类@Controller,一个条目将被添加到生成的reflect-config.json文件中。

无法推断出某些本机配置,对于这些情况,我们引入了本机提示注释(有关更多详细信息,请参见Javadoc),这使Spring Native可以比基于常规JSON的本机图像配置更可维护,类型安全和灵活地支持本机配置。例如同春本地MySQL驱动支持提供线索,让一代机映像正确的条目reflect-config.jsonresource-config.json以及native-image.properties如下:

@NativeHint(
    trigger = Driver.class,
    options = "--enable-all-security-services",
    types = @TypeHint(types = {
       FailoverConnectionUrl.class,
       FailoverDnsSrvConnectionUrl.class,
       // ...
    }), resources = {
    @ResourceHint(patterns = "com/mysql/cj/TlsSettings.properties"),
    @ResourceHint(patterns = "com.mysql.cj.LocalizedErrorMessages",
                      isBundle = true)
})
public class MySqlHints implements NativeConfiguration {}

NativeConfiguration和其他动态配置机制允许更强大的和动态的配置生成,但要注意它们的API将在即将到来的版本演变了很多。

Spring开发人员还可以使用特定于应用程序的本机提示直接注释其@Configuration@SpringBootApplication类,例如,Book通过诸如RestTemplate或的编程API将类序列化为JSON WebClient

@TypeHint(types = Book.class)
@SpringBootApplication
public class WebClientApplication {
    // ...
}

与提前转换系统一起使用时,最后一种可能是最强大的机制是使用Spring Boot部署模型与GraalVM native结合引入的封闭世界假设自动生成本机优化代码(源代码和字节码)的功能。图像特征。这里的目标是通过使用本机图像编译器可以开箱即用地分析的代码构造来限制所需的额外本机配置的数量,以提高兼容性,并通过减少反射所需的配置数量来减少占用空间,资源或代理。一个具体的例子是各种形式的提前转换spring.factories (Spring Boot背后的扩展机制)到优化的程序设计版本,该版本不需要反射,并且可以在应用程序的上下文中过滤掉不必要的条目。

这只是Spring AOT的开始,我们打算向[@Configuration功能配置中添加更强大的转换,以通过提前分析来替换运行时反射,该提前分析将自动生成配置类,这些配置类将使用lambda和方法引用之类的程序化构造。这将使GraalVM本机图像编译器可以立即了解Spring配置,而无需任何反射配置或*.class资源。

要记住的一个关键点是,在使用Spring Native时,默认情况下在JVM上也会使用AOT生成的代码,以允许您使用JVM允许的短反馈循环来行使“本机友好的代码路径”。您的调试器和所有常规工具。

尽管Spring AOT转换当前主要由本机需求驱动,但是其中许多不是本机特定的,并且可能其中一些可以提供优化以在JVM上运行Spring Boot应用程序。与此类主题一样,重要的是数据驱动,以便我们测量效率和绩效来决定我们的决策。

我们可能会改进IDE的集成,现在确保在IDE中运行应用程序之前,请先阅读相关文档以进行潜在的手动配置步骤,以更新生成的源代码。

5 结论

Spring战略要本地化有两个主要支柱。第一个是使Spring基础结构适应本机,而无需对数百万个现有的Spring Boot应用程序进行重大更改。其中包括我们在Spring顶级项目中所做的更改,以使其对本机友好,@NativeHint我们将在Spring Native中成熟的基础架构(例如)和Spring AOT构建插件。

第二个支柱比Spring本身更广泛,native是一个具有与JVM不同的特性的平台,但是Java生态系统需要尽可能地一致,以避免两种非常不同的Java风格,这将难以维护。这就是为什么我们与GraalVM团队进行深入合作以缩小这一差距的原因。在接下来的几个月中,这项合作将专注于为更广泛的JVM生态系统改善本机测试和本机配置。

来源:https://spring.io/blog/2021/03/11/announcing-spring-native-beta

本文首发于公众号:Java版web项目,欢迎关注获取更多精彩内容

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容