Spring 官宣,干掉原生 JVM!

点击关注公众号,Java干货及时送达👇

b3b458bf4d2baa5ae00f0de1371951f8.png

文章来源:http://t.csdn.cn/ioC1d

目录

  • 1. 团队协作

  • 2. 支持的范围

  • 3. start.spring.io

  • 4. 预先转换

  • 5. 结论

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

最近,Spring 发布了 Spring Native 的 beta 版本,该功能已经在 start.spring.io 上可用了。

https://github.com/spring-projects-experimental/spring-native

https://start.spring.io/

这意味着,除了 Spring 诞生以来就支持的 Java 虚拟机,官方添加了使用 GraalVM 将 Spring 应用编译成原生镜像的 beta 支持,这样的话,就能提供一种新的方式来部署 Spring 应用。Spring Native 支持 Java 和 Kotlin。

这些原生的 Spring 应用可以作为一个独立的可执行文件进行部署(不需要安装 JVM),并且还能提供有趣的特征,包括几乎瞬时的启动(一般会小于 100 毫秒)、瞬时的峰值性能以及更低的资源消耗,其代价是比 JVM 更长的构建时间和更少的运行时优化。

cfc391bf852c35e0b265f2fe38befa7e.jpeg

通过简单的 mvn spring-boot:build-image 或 gradle bootBuildImage 命令,就能生成一个优化的容器镜像,它包含了一个最小的操作系统层和一个小的原生可执行文件,该文件只包含了必需的东西即 JDK、Spring 以及应用中所使用的依赖。

请看下面这个最小的容器镜像,它是一个 50MB 的可执行文件,包含了 Spring Boot、Spring MVC、Jackson、Tomcat、JDK 和应用本身。

2913cd0afaefdba2205495210b97bae9.jpeg

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

  • 使用 Spring Cloud Function 的 Serverless 应用

  • 更廉价、更可持续地托管 Spring 微服务

  • 与 VMware Tanzu 这样的 Kubernetes 平台有很好的契合性

  • 想要最优的容器镜像,以打包 Spring 应用和服务

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

https://piotrminkowski.com/2021/03/05/microservices-on-knative-with-spring-boot-and-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 生态系统的一个子集上提供了对原生的支持。如果你的应用正在使用业已支持的依赖,那么你可以试用它,在出现问题时可以提 bug 或贡献 pull request。在最新的 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 等。


3.start.spring.io

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

a4c767ad9fb1bd9ae6d32769f26923a3.jpeg

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

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


4. 预先转换

原生与JVM有说不同:类路径在构建时是固定的,反射或资源需要进行配置,这里没有类的懒加载(可执行文件中包含的所有内容在启动的时候都会加载进来)并且有些代码可以在构建期调用。

为了充分拥抱这些特性,并且能让 Spring 应用以最大的兼容性和最小的资源消耗运行在原生环境中,Brian Clozel 在这个版本中引入了 Spring 预先(ahead-of-time,AOT)转换的 Maven 和 Gradle 插件,这个插件会对 Spring 应用执行预先转换。

第一种转换的目的是生成 GraalVM 原生配置(反射、资源、代理、原生镜像选项),这是通过由 Andy Clement 设计和实现的一个特别棒的推断引擎做到的,该引擎能够理解 Spring 编程模型和基础设施。例如,每个带有 @Controller 注解的类,都会在生成的 reflect-config.json 文件中添加一个条目。

有些原生配置是无法推断的,对于这些情况,Spring Native 引入了原生线索(native hint)注解(参见 Javadoc 以了解详情),这些注解允许 Spring Native 支持原生配置,这种方式比常规的基于 JSON 的原生镜像配置更加可维护、类型安全和灵活。例如,Spring Native 对 MySQL 驱动支持就提供了线索注解,它们会在原生镜像配置 reflect-config.json、resource-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 类上添加应用特定的原生线索注解,例如,对于使用 RestTemplate 或 WebClient 这样的编程 API 序列化一个 Book 类为 JSON:

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

在使用预先转换系统时,最后一个,可能也是最强大的一个机制就是根据 Spring Boot 部署模型和 GraalVM 原生镜像特征所引入的封闭世界(closed-world)假设,它能够自动生成针对原生环境进行优化的代码。这里的目标就是限制所需的外部原生配置的数量,从而提高兼容性,这是通过原生镜像编译器对代码结构的分析实现的,同时还能通过减少反射、资源或代理所需的配置,降低资源占用。一个具体的例子就是对各种 spring.factory(Spring Boot 背后的扩展机制)的预先转换,从而实现一个优化过的程序版本,该版本不需要反射并且会过滤掉应用上下文中不必要的条目。

对 Spring AOT来说,这只是一个开始,我们计划添加更加强大的转换,比如将 @Configuration 替换为函数式配置,从而通过预先分析替换运行时反射,能够自动生成使用像 lambda 表达式和方法引用这种程序构造的配置类。这样的话,就能允许 GraalVM 原生镜像编译器立即理解 Spring 配置,无需任何的反射配置或 *.class 资源。

需要记住的一个关键点是,在使用 Spring Native 时,这个 AOT 生成的代码在 JVM 上也会默认使用,这样的话能够通过 JVM 允许的短反馈循环(short feedback loop),用调试器和所有常规工具实现“原生友好的代码路径”。

尽管Spring AOT转换目前主要是由原生场景需求驱动,但是有很多转换并不是特定于原生场景的,有一些可能为 JVM 上运行的 Spring Boot 应用提供优化。和往常一样,对于这种主题,重要的是要以数据为驱动,所以我们会衡量效率和性能来驱动我们的决策。

我们很可能会完善 IDE 集成,目前请务必阅读相关文档,了解潜在的手动配置步骤,以便在 IDE 中运行应用程序之前更新生成的源码。


5. 结论

在支持原生方面,Spring 有两个支柱性的策略。第一个是在不需要对现有的数百万个 Spring Boot 应用进行重大改动的情况下,对 Spring 基础架构进行调整以适应原生。这包括在 Spring 顶层项目中为实现原生友好而做出的改变,像 @NativeHint 这样的基础架构,以及在 Spring Native 中逐渐成熟的 Spring AOT 构建插件。

第二个支柱比Spring本身的范围更广,原生是一个与 JVM 特性有所差异的平台,但 Java 生态系统需要尽可能地保持一致,以避免出现两种截然不同的 Java 风格,如果这样的话,将会是维护上的一个挑战。

原文链接:

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

 
 
 
 
热门内容:
  • 一款 IntelliJ IDEA 神级插件,由 ChatGPT 团队开发,堪称辅助神器!

  • 7min 到 40s:SpringBoot 优化居然可以玩出这么多花样!

  • Jenkins 真得很牛逼!只是大部分人不会用而已~(保姆级教程)

  • 这次被 foreach 坑惨了,再也不敢乱用了....

 

02a9834edf474d6addc8acc6ad415386.jpeg

 
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19507.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测算法——YOLOv5/v7/v8改进结合涨点Trick之Wise-IoU(超越CIOU/SIOU)

超越CIOU/SIOU | Wise-IoU助力YOLO强势涨点!!! 论文题目:Wise-IoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism 论文链接:https://arxiv.org/abs/2301.10051 ​ 近年来的研究大多假设训练数据中的…

低代码平台这么多,能用来找工作可能只有它了

前言引入 “低代码开发平台”是一种用于快速设计和开发应用程序的软件系统,在中国企业数字化浪潮下,企业对软件应用需求提升,IT资源供需不平衡以及传统开发成本高等原因,让低代码开发在中国具有巨大的发展潜力。 文章目录 前言引入…

干货贴丨图像数据标注有哪些好用的工具

随着AI与传统行业的不断融合以及5G的发展,AI数据服务方式由粗放式向着精细化方向过渡,数据标注工具的发展也经历了从「能用就行」到「好用且高效」的阶段。 大家都知道不同的标注类型使用的标注方法、工具、存储类型都不一样,在了解图像标注…

基于JAVAEE的停车场管理系统(论文+PPT+源码

详情介绍 毕业设计(论文) 论文题目基于JAVAEE的停车场管理系统Thesis TopicJAVAEE – based parking management system 毕业设计(论文)任务书 毕业设计(论文)题目:基于JAVAEE的停车场管理系…

年轻人搞副业有多野:月薪4500,副业收入上万

前段时间,微博上有个热搜特别火,副业刚需。 意思是,在现在这个飞速发展的时代里,很多人觉得靠自己那点微薄的工资,很难养活自己;更是稍不留神,就被同龄人甩开一大截。 上面这张微博投票显示&…

基于51单片机的简易抢答器设计

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书,通俗易懂,风趣幽默,无广告,忍不住分享一下给大家。(点击查看学习资料) 基于51单片机的简易抢答器 具体功能: 1、主持人按下抢答开始按键…

电路基本知识

火线、零线、地线 L: live 火线 N: Neutral 中性 零线 PE : Protection Earthing 保护接地 PEN : Protection Earthing Neutral 保护中性线 火线零线和地线到底有什么区别?接地接到哪了?_哔哩哔哩_bilibili 家庭用电 工业用电 L1:R …

hnust 湖南科技大学 2023 软件测试技术 期中考试 复习资料

前言 写的比较匆忙,重点也不明确,没什么参考价值致谢:ly,zxq重点来源:信安※:补充内容★:重点✦:个人推测考点考试范围:1-9章获取最新版本 题型 判断:10简…

单片机开发---ESP32S3移植NES模拟器(二)

书接上文 《单片机开发—ESP32-S3模块上手》 《单片机开发—ESP32S3移植lvgl触摸屏》 《单片机开发—ESP32S3移植NES模拟器(一)》 暖场视频,小时候称这个为—超级曲线射门!!!!!&am…

开个帖子 记录刷题过程。

由于是转码 也深知代码能力的重要性 但之前断断续续的刷总觉得没什么长进 今天痛定思痛 决定开一个帖子 用来记录我的刷题过程 以此监督自己 。 2023.5.15 今天练习了贪心思想 目前我觉得比较关键的点是 排序 与 搞清楚贪心的对象。 455没有什么好说的 435需要明白 我们需要贪…

CTFshow web入门之信息收集(web1-web20)

信息搜集: 文章目录 信息搜集:web1:web2:web3:web4:web5:web6:web7:web8:web9:web10:web11:web12:web13&#…

chatgpt赋能python:Python主机发现——提高SEO效果的必备方法

Python 主机发现——提高SEO效果的必备方法 作为一名有10年python编程经验的工程师,我发现Python主机发现是一种非常有效的提高搜索引擎优化(SEO)效果的方法。虽然它可能会花费一些时间和精力,但是一旦你掌握了这个技能&#xff…

3DMax 卡死、白屏、渲染死机问题总结

白屏: 3dmax出现白屏解决方法 以下是ChatGPT给出的答案 内存不足:3DsMax需要大量的内存才能正常运行。如果你的计算机内存不足,3DsMax就会卡死。解决办法是升级你的计算机内存或者关闭一些不必要的程序来释放内存。 显卡驱动过时&#xff1…

世界杯——手动为梅西标名

梅西的铁粉来集赞啦。 今天带来了一个为图片添加字样的小功能,我们的测试目标图片是: 我们的测试目标是: 我们使用的是Python语言,使用了Image包用作图片处理,matplotlib包用作坐标查阅,这个坐标还是很好看…

不要对chatgpt过度反思 第二部分

如果未来,它真的可以引爆下一轮科技革命,只要双方不存在科技代差,就无法阻止科技扩散。 打个比方,如果你本身没有网络基础,没有大数据,她确实和你无关,反之,捅破了那层窗户纸&#x…

关于本次周总结

在本次的前端的学习中,虽然前端入门简单,但自己运用起来却有点小难度,尤其是自己做一个页面的时候,页面乱的让人疯狂,归根结底还是知识掌握的不扎实,没有得心应手的感觉用着没有丝滑感,我认真反…

独家 | ChatGPT提高你日常工作的五个特点以及如何使用它来提高代码质量

翻译:陈超 校对:赵茹萱本文约3200字,建议阅读8分钟 本文介绍了ChatGPT提高日常工作的五个特点。 ChatGPT已经完全改变了代码开发模式。然而,大多数软件开发者和数据专家们仍然不使用ChatGPT来完善——并简化他们的工作。 这就是我…

Python+chatGPT编程法力无边?

作为初学者,我们总是有一些不好意思问的问题。 现在我们可以尽情社恐,我们甚至可以向 ChatGPT 提出最低级的代码问题。 假设我们忘记了如何将两个字典合并。以下是 ChatGPT 可以如何帮助你的部分。 ChatGPT 还可以协助你进行更好的在线学习。假设你正在…

有了ChatGPT我还需要学习Python吗?

前言 ChatGPT是人工智能的产物,理解人类的思维,精通各种语言,能够辅助我们写代码,但是无法完全取代人类去编写代码。 首先,ChatGPT提供给我们一个思路去解决,它编写的代码不是完全正确的。如果我们不学习…

AutoGPT自主人工智能用法和使用案例

介绍 AutoGPT是什么:自主人工智能,不需要人为的干预,自己完成思考和决策【比如最近比较热门的用AutoGPT创业,做项目–>就是比较消耗token】 AI 自己上网、自己使用第三方工具、自己思考、自己操作你的电脑【就是操作你的电脑…