前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Spring 官宣,抛弃原生 JVM!网友:这是要单干啊!

Spring 官宣,抛弃原生 JVM!网友:这是要单干啊!

作者头像
终码一生
发布于 2022-04-14 07:16:38
发布于 2022-04-14 07:16:38
1.7K00
代码可运行
举报
文章被收录于专栏:终码一生终码一生
运行总次数:0
代码可运行

前言

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

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

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

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

使用简单mvn spring-boot:build-image或gradle 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 构建原生微服务。

团队协作

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 生态系统中的众多用法,为原生编译的广泛采用铺平了道路。”

支持范围

随着 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

start.spring.io

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

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

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

提前转换

本机不同于 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如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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 中运行应用程序之前,请先阅读相关文档以进行潜在的手动配置步骤,以更新生成的源代码。

结论

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 终码一生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Typecho 更换Gravatar国内源,解决Gravatar头像无法加载
Gravatar是Globally Recognized Avatar的缩写,意为“全球通用头像”,如果在Gravatar的服务器上放置了你自己的头像,只要提供你与这个头像关联的Email地址,就能够显示出你的Gravatar头像来
Xcnte
2021/12/14
2.5K0
文件上传413 错误解决办法
可以选择在http{ }中设置:client_max_body_size 20m;
ITer.996
2019/08/28
3.3K0
文件上传413 错误解决办法
Typecho首页置顶文章的显示问题的解决
1. 同一篇文章会在首页的所有分类里面均置顶显示; 2. 如果是相同分类下的最近的文章,则会重复显示;
目的地-Destination
2023/03/06
1.3K0
Typecho首页置顶文章的显示问题的解决
iis伪静态中文url出现乱码的解决办法
首先要看下你安装的是IIS rewrite_2.0还是ISAPI_Rewrite 3.x的伪静态插件。
会长君
2023/04/26
2.3K0
CentOS 7 配置 Nginx + php + mysql 搭建 lnmp 环境过程全纪录
本文主要介绍了如何在 CentOS 7 服务器上配置 Nginx + PHP + MariaDB 环境以及部署 WordPress 站点。包括安装必要的软件、配置文件以及优化数据库和缓存等方面,旨在帮助读者快速搭建一个稳定、高效的网站环境。
FungLeo
2018/01/08
5.1K5
2022 CSP-J第二轮复赛题解
小文同学刚刚接触了信息学竞赛,有一天她遇到了这样一个题:给定正整数a和b,求ab 的值是多少。ab即b个a相乘的值,例如23即为3个2相乘,结果为2x2x2=8。
一枚大果壳
2023/09/11
1K0
2022 CSP-J第二轮复赛题解
​【DEDE伪静态】织梦DeDeCms手机站伪静态列表分页错误解决办法,生成列表翻页动态
DEDE织梦cms常用的参数标签汇总、以及操作过程中的一些bug问题解决方法,dede网站二开,以下龙腾飞网络科技-小吴在建站实操中笔记记录,织梦dede建站教程保存使用非常方便:
攻城狮与产品喵
2025/03/13
1510
​【DEDE伪静态】织梦DeDeCms手机站伪静态列表分页错误解决办法,生成列表翻页动态
WordPress升级版本或插件失败的解决办法
今天在给WordPress升级插件的时候提示“Briefly unavailable for scheduled maintenance. Check back in a minute”,中文翻译的话就是“正在执行例行维护,请一分钟后回来”,然整个网站都打不开。因为不是第一次碰到这个问题了,所以解决起来也是轻车熟路。
半夜喝可乐
2024/09/30
2180
WordPress升级版本或插件失败的解决办法
typecho安装过程遇到的问题以及解决办法
typecho官方安装文档:http://docs.typecho.org/install typecho常见问题汇总:http://docs.typecho.org/faq 安装环境: lnmp,其中linux为centos ,php版本为php7.0 问题1:遇到需要手动创建common.inc.php文件后,无法生效? 操作过程:拷贝之后直接用vim打开并shift+insert粘贴进去 正确姿势:按住i进入插入模式之后再shift+insert粘贴 问题2:数据库连接失败? 如果使用的ph
槽痞
2020/06/23
1.8K0
Baidu Sitemap Generator 报错且不更新解决办法
很多人在升级了PHP或者更换空间之后,会发现WordPress的百度 XMLSitemap 生成器插件出现问题,在点击Update XML file时会报如下错误:
聚优云惠
2020/02/18
6440
站点迁移后打不开的解决办法
网站搬家可以分为两种情况,比方说用原来的域名换个服务器,或者用原来的服务器换个域名!
宜轩
2022/12/26
1.7K0
Discuz!关于出现“对不起,您安装的不是正版应用”的解决办法
discuz! 社区在更新到2.0以上后,增加了对插件的版本检测,在安装时,可能会出现:“对不起,您安装的不是正版应用,安装程序无法继续执行”的提示,要解决这个其实挺容易的,找到以下文件: /source/function/function_cloudaddons.php 找到文件中的cloudaddons_validator这个处理过程,将中间提示部份注释掉,改为像以下这样即可大功告成。 function cloudaddons_validator($addonid) {   $array =
似水的流年
2018/01/18
6090
sphinx 配置 及 小内存解决办法
不得不说 sphinx 很消耗内存占用,目前种子网站跑的机器是2G内存的,今天重新试了一下1G内存的vps,正常配置下依旧跑不动 查看 searchd.log 依旧被kill掉了。
上山打老虎了
2022/06/14
1K0
【真题】暑假备战CSP-J/S:NOIP2014提高组初赛(第一轮)试题及参考答案(PDF版、无水印可直接打印)
公众号内回复【NOIP2014S】即可获取下载链接,直接打印电子版让孩子做即可,文件包含
小码匠
2023/08/31
3270
【真题】暑假备战CSP-J/S:NOIP2014提高组初赛(第一轮)试题及参考答案(PDF版、无水印可直接打印)
OD反汇编EXE添加一个启动时的消息框
最近有一个要修改PE文件的需求,就先从EXE文件下手吧,我也是初学一个小时而已,不过之前接触过一点汇编罢了,这篇文章算是个DEMO,主要的思路是将其反汇编得到汇编代码后,然后手动修改他的逻辑首先跳转到弹框区域再跳转回来去执行原来的代码,相关的工具有ollydbg,以及要修改的一个xp系统自带的扫雷软件,还有参考的文章,都会在文末给出。
WindRunnerMax
2021/06/17
1.2K0
OD反汇编EXE添加一个启动时的消息框
Python Django开发 异常及其解决办法(二)
由于xadmin的更新跟不上Django的更新,因此导致了xadmin的很多代码出错,需要进行修改,这里将xadmin\plugins\filters.py中from django.db.models.sql.query import LOOKUP_SEP, QUERY_TERMS修改为from django.db.models.sql.query import LOOKUP_SEP, Query,还需要将47行的if len(parts) > 1 and parts[-1] in Query:修改为if len(parts) > 1 and parts[-1] in QUERY_TERMS:。
cutercorley
2020/07/23
1.4K0
教你动手移植RT-Thread到国产MCU
摘要 现在芯片价格不断上涨,国内很多厂商也在不断的找替换方案。以ST为例,一个芯片涨了十几倍。蛋疼。。。。 最近刚好有机会拿到国产芯片MCU--兆易创新的评估板(GD32350R)。板载资源如下: 硬件描述芯片型号GD32F350R8T6CPUARM Cortex M4主频108M片内SRAM16K片内FLASH64K下载器GD-Link 拿到这个板子,首先肯定是去看看RT-THREAD是否已经包含这个BSP了,答案:没有这个GD32F350系列的BSP。那必须把他移植个RTT,然后PR一个BSP上去才
Rice加饭
2022/05/10
1.4K0
教你动手移植RT-Thread到国产MCU
APP测试之使用ADB可能遇到的错误及解决办法
%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;
可可的测试小栈
2019/10/17
4.3K0
千呼万唤始出来——uFUN开发板2.0开箱评测
今年3月,我参与了面包板社区组织的第一批uFUN开发板评测活动,并有幸能获得试用机会,那是我第一次了解到uFUN这个项目及背后的故事,4月份,uFUN 2.0版本来了,收到了张工送的一块样板,后来又收到一块量产板,非常感谢。其实开发板很早就收到了,也玩了一段时间,早就计划着写一篇开箱评测,正好最近面包板正在开展新版uFUN的评测活动,我也来参与一下,写写停停,终于写完了,以下内容仅仅是我个人的观点,有错误的地方欢迎各位朋友指正、互相交流学习!
单片机点灯小能手
2020/07/17
9150
千呼万唤始出来——uFUN开发板2.0开箱评测
Python数据分析实战基础 | 清洗常用4板斧
这是Python数据分析实战基础的第三篇内容,主要对前两篇进行补充,把实际数据清洗场景下常用但零散的方法,按增、删、查、分四板斧的逻辑进行归类,以减少记忆成本,提升学习和使用效率。
Python数据科学
2019/11/21
2.1K0
推荐阅读
相关推荐
Typecho 更换Gravatar国内源,解决Gravatar头像无法加载
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档