Spring学习总结(32)—— 宣布 Spring Native Beta 版!
Posted 科技D人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习总结(32)—— 宣布 Spring Native Beta 版!相关的知识,希望对你有一定的参考价值。
今天,经过一年半的工作,我很高兴地宣布,我们将发布Spring Native的 beta 版本及其在start.spring.io上的可用性!
实际上,这意味着除了 Spring 自推出以来支持的常规 Java 虚拟机之外,我们还添加了 beta 支持,以使用GraalVM将 Spring 应用程序编译为原生映像,以提供一种部署 Spring 应用程序的新方法。支持 Java 和 Kotlin。
这些原生 Spring 应用程序可以部署为独立的可执行文件(无需安装 JVM)并提供有趣的特性,包括几乎即时启动(通常 < 100 毫秒)、即时峰值性能和更低的内存消耗,但代价是构建时间更长,运行时优化更少JVM。
使用简单的mvn spring-boot:build-image
或gradle bootBuildImage
命令,您可以生成一个优化的容器映像,该映像将包含一个最小的操作系统层和一个小型本机可执行文件,该可执行文件仅包含来自 JDK、Spring 和您在应用程序中使用的依赖项所需的位。例如,请参见下面的最小容器映像,其中包含 50MB 的可执行文件,其中包含 Spring Boot、Spring MVC、Jackson、Tomcat、JDK 和应用程序。
有广泛的用例,原生可能对您的 Spring 应用程序有意义:
-
具有 Spring Cloud 功能的无服务器
-
更便宜、更可持续地托管 Spring 微服务
-
非常适合VMware Tanzu等 Kubernetes 平台
-
想要创建打包 Spring 应用程序和服务的最佳容器映像
团队合作
Spring Native beta 是 Spring 团队及其项目组合广泛协作的结果:Spring Framework、Spring Boot 以及 Spring Data、Spring Security、Spring Cloud 和 Spring Initializr。查看此视频,观看 Spring 团队解释我们如何构建 Spring Native beta 及其提供的内容,包括全新start.spring.io支持的演示。
我们的原生工作范围比 Spring 更广泛,因为原生涉及更广泛的 JVM 生态系统,因此我们一直在与 GraalVM 团队合作,以提高原生镜像兼容性和足迹。以下是来自 GraalVM 团队的Vojin Jovanovic的话:
“很高兴与 Spring 团队合作打造原生 JVM 生态系统:他们深厚的技术知识,以及对社区的敏感接触,总能带来最佳解决方案。最新的 Spring Native 版本及其在 JVM 生态系统中的大量使用,为原生编译的广泛采用铺平了道路。”
支持范围
随着 Spring Native 从 alpha 升级到 beta,我认为澄清我们提供的支持范围很重要。
Alpha 是第一步,我们进行了大量试验,并在一组样本上进行了大量突破性更改,改进了 Spring Native(以前称为 Spring GraalVM Native)架构、兼容性和占用空间。我们还报告了GraalVM 团队修复的许多问题,以减少 Spring 应用程序的 JVM 和本机之间的差距。
虽然它仍然被认为是实验性的,但 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 格式提供,我们发布用于本机提示公共 API 的 Javadoc。
start.spring.io
Stéphane Nicoll在start.spring.io和相关的 IDE 集成中引入了对 Spring Native 的支持,所以到目前为止,这可能是探索如何使用 Spring 构建本机应用程序的最简单方法。
添加 Spring Native 依赖项将使用所需的依赖项和插件自动配置您的 Maven 或 Gradle 项目以支持本机。应用程序代码本身没有改变。
确保检查生成的HELP.md
文件,其中包含有用的链接和文档,但还要指出您是否选择了一些本机不支持的依赖项。
提前转型
Native 与 JVM 不同:类路径在构建时固定,例如反射或资源需要配置,没有类延迟加载(可执行文件中的所有内容都在启动时加载到内存中)并且可以调用一些代码在构建时。
为了充分利用这些特性并允许 Spring 应用程序在本机上以最大的兼容性和最小的占用空间运行,Brian Clozel在此版本中引入了 Spring 提前 (AOT) Maven 和 Gradle 插件,它们可以提前执行应用程序上的转换。
第一种转换旨在基于由了不起的Andy Clement设计和实现的推理引擎生成 GraalVM 本地配置(反射、资源、代理、本地图像选项),他了解 Spring 编程模型和基础设施是什么。例如,对于每个由 注释的类@Controller
,将在生成的reflect-config.json
文件中添加一个条目。
一些本机配置无法推断,对于这些情况,我们引入了本机提示注释(有关更多详细信息,请参阅Javadoc),它允许 Spring Native 以比常规基于 JSON 的本机图像配置更可维护、类型安全和灵活的方式支持本机配置。例如同春本地mysql驱动支持提供线索,让一代机映像正确的条目reflect-config.json
,resource-config.json
以及native-image.properties
如下:
<span style="color:#191e1e"><code><span style="color:#006666">@NativeHint</span><span style="color:#666600">(</span><span style="color:#000000">
trigger </span><span style="color:#666600">=</span> <span style="color:#660066">Driver</span><span style="color:#666600">.</span><span style="color:#000088">class</span><span style="color:#666600">,</span><span style="color:#000000">
options </span><span style="color:#666600">=</span> <span style="color:#008800">"--enable-all-security-services"</span><span style="color:#666600">,</span><span style="color:#000000">
types </span><span style="color:#666600">=</span> <span style="color:#006666">@TypeHint</span><span style="color:#666600">(</span><span style="color:#000000">types </span><span style="color:#666600">=</span> <span style="color:#666600">{</span>
<span style="color:#660066">FailoverConnectionUrl</span><span style="color:#666600">.</span><span style="color:#000088">class</span><span style="color:#666600">,</span>
<span style="color:#660066">FailoverDnsSrvConnectionUrl</span><span style="color:#666600">.</span><span style="color:#000088">class</span><span style="color:#666600">,</span>
<span style="color:#880000">// ...</span>
<span style="color:#666600">}),</span><span style="color:#000000"> resources </span><span style="color:#666600">=</span> <span style="color:#666600">{</span>
<span style="color:#006666">@ResourceHint</span><span style="color:#666600">(</span><span style="color:#000000">patterns </span><span style="color:#666600">=</span> <span style="color:#008800">"com/mysql/cj/TlsSettings.properties"</span><span style="color:#666600">),</span>
<span style="color:#006666">@ResourceHint</span><span style="color:#666600">(</span><span style="color:#000000">patterns </span><span style="color:#666600">=</span> <span style="color:#008800">"com.mysql.cj.LocalizedErrorMessages"</span><span style="color:#666600">,</span><span style="color:#000000">
isBundle </span><span style="color:#666600">=</span> <span style="color:#000088">true</span><span style="color:#666600">)</span>
<span style="color:#666600">})</span>
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#660066">MySqlHints</span> <span style="color:#000088">implements</span> <span style="color:#660066">NativeConfiguration</span> <span style="color:#666600">{}</span></code>复制</span>
NativeConfiguration
和其他动态配置机制允许更强大和动态的配置生成,但要注意它们的 API 将在即将推出的版本中发展很多。
Spring 开发人员还可以使用特定于应用程序的本机提示直接注释他们的@Configuration
或@SpringBootApplication
类,例如Book
通过编程 API将类序列化为JSON,如RestTemplate
或WebClient
:
<span style="color:#191e1e"><code><span style="color:#006666">@TypeHint</span><span style="color:#666600">(</span><span style="color:#000000">types </span><span style="color:#666600">=</span> <span style="color:#660066">Book</span><span style="color:#666600">.</span><span style="color:#000088">class</span><span style="color:#666600">)</span>
<span style="color:#006666">@SpringBootApplication</span>
<span style="color:#000088">public</span> <span style="color:#000088">class</span> <span style="color:#660066">WebClientApplication</span> <span style="color:#666600">{</span>
<span style="color:#880000">// ...</span>
<span style="color:#666600">}</span></code>复制</span>
使用提前转换系统时可用的最后一个也是可能最强大的机制是使用 Spring Boot 部署模型引入的封闭世界假设与 GraalVM 本机结合自动生成本机优化代码(源代码和字节码)的能力图像特征。这里的目标是通过使用可由本机图像编译器开箱即用的代码结构来限制所需的额外本机配置的数量以提高兼容性,并通过减少反射所需的配置量来降低占用空间,资源或代理。一个具体的例子是提前转换各种spring.factories
(Spring Boot 背后的扩展机制)到一个优化的编程版本,它不需要反射并过滤掉应用程序上下文中不必要的条目。
这只是 Spring AOT 的一个开始,我们打算添加更强大的转换,如@Configuration
功能配置,以通过提前分析替换运行时反射,该分析将自动生成将使用编程结构(如 lambdas 和方法引用)的配置类。这将允许 GraalVM 本机图像编译器开箱即用地理解 Spring 配置,而无需任何反射配置或*.class
资源。
要记住的一个关键点是,在使用 Spring Native 时,默认情况下也会在 JVM 上使用此 AOT 生成的代码,以允许您使用 JVM 允许的短反馈循环来练习“本机友好代码路径”,您的调试器和所有常规工具。
虽然 Spring AOT 转换目前主要由本机需求驱动,但其中很多不是本机特定的,有些可能会为在 JVM 上运行 Spring Boot 应用程序提供优化。与此类主题一样,数据驱动很重要,因此我们将衡量效率和性能以推动我们的决策。
我们可能会改进 IDE 集成,现在请务必阅读相关文档以了解潜在的手动配置步骤,以便在您的 IDE 中运行应用程序之前更新生成的源。
结论
Spring 的本地化策略有两个主要支柱。第一个是在不需要对数百万现有 Spring Boot 应用程序进行重大更改的情况下为原生调整 Spring 基础设施。这包括我们在 Spring 顶级项目中所做的对原生友好的更改@NativeHint
、我们在 Spring Native 中成熟的基础设施和 Spring AOT 构建插件。查看我们的路线图,了解有关后续步骤的更多信息。
第二个支柱比 Spring 本身更广泛,native 是一个与 JVM 具有不同特征的平台,但 Java 生态系统需要尽可能保持一致,以避免两种截然不同的 Java 风格难以维护。这就是我们与 GraalVM 团队密切合作以缩小这一差距的原因。在接下来的几个月中,这项合作将专注于为更广泛的 JVM 生态系统改进本机测试和本机配置。
Spring 开发人员可以通过我们提供的各种示例了解更多关于 native 的信息,去start.spring.io测试我们新的 native 支持,阅读更新的参考指南,阅读发行说明,特别是如果你是从以前的版本升级,甚至为您最喜欢的依赖项提供支持。如果您想了解更多有关 Spring 商业支持的信息,也可以联系我们。
最后,我要非常感谢 Spring 社区,他们已经提供了很多有用的反馈和贡献,感谢 GraalVM 团队进行了这次了不起的合作,感谢更广泛的 Spring 团队,他们努力使 Spring 开发人员更容易采用本机.
以上是关于Spring学习总结(32)—— 宣布 Spring Native Beta 版!的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot 学习总结(32)—— Spring Boot 3.0 正式发布
Spring Boot 学习总结(32)—— Spring Boot 3.0 正式发布