作者:铖朴
新版本预览
本次发布的 Spring Cloud Alibaba 2022.0.0.0-RC1 版本,是基于社区 2022.x 主干分支进行构建发布第一个 Release Candidate(RC)版本,考虑到本次版本升级属于重大版本变更,因此暂时先以 RC 版本形式发布,当前大家可以先试用起来,待后续时机成熟社区会尽快发布正式版本。新版本预览内容如下:
2022.0.0.0-RC1 版本
是在 Spring Cloud 2022.0.0、Spring Boot 3.0 的基础上,对生态中原有的包括注册配置中心、分布式消息等在内的众多组件进行了适配,属于一个大变更的版本。本次发布的 Spring Cloud Alibaba 2022.0.0.0-RC1 版本对以下组件版本进行了适配:
-
Seata:客户端适配版本为 1.6.1 版本 [ 1] ,该版本相比于之前的1.5.x版本,已经支持MySQL updatejoin,PostgreSQL & Oracle多主键支持,InsertOnDuplicateUpdate 做了大量优化,支持多注册中心等及核心功能大量优化,该版本客户端已完成JDK 17的支持。
-
RocketMQ:客户端适配版本为 4.9.4版本 [2 ] ,该版本提供了轻量级消息队列和为延迟消息提供异步发送功能等在内的诸多特性。
-
Sentinel:客户端适配版本为 1.8.6 版本 [3 ] ,该版本调整了Sentinel规则类中的属性,并将javax.* 包下的相关基础类都替换为了jakarta.*包路径下的,以兼容 JDK 17 。
-
Nacos: 客户端适配版本为 2.2.1-RC,该版本是Nacos社区在最新发布的 2.2.0 版本基础上为适配最新GraalVM构建原生镜像而推出的最新版本客户端,该版本可直接搭配Nacos 2.x系列Nacos Server使用,不仅能体验 2.2.0 最新带来的数据源、连接限流等插件能力,而且可直接构建GraalVM原生镜像,启动速度和运行时内存得到大幅降低。
除了组件升级,另外也修复了一些之前版本所存在的问题,进一步提升了Spring Cloud Alibaba 使用的稳定性与健壮性。更多内容可参见该版本相关发版公告 [4 ] 。
版本解读
为什么是 JDK 17?
很多人,听到 Spring Boot 3.0 默认所需的 JDK 最低版本为 17 会感到非常诧异!对很多 JDK 8 用户来说 Spring 官方的选择一定是不明智的。真的是这样的吗?对于这个问题,我们认为主要基于 2 个原因:Oracle 官方对 JDK 支持政策和技术先进性。
Oracle 当前对所有发布的 JDK 版本分为 Long-Term-Support (LTS) releases 和 non-TLS releases,TLS 版本的 JDK 作为 Oracle 官方长期支持的版本,在未来的很长一段时间内,官方都会对该版本进行持续的维护和更新。而 non-TLS 版本的 JDK 仅仅是作为过度版本,只要下一个 LTS 版本出现以后,官方就不会对其进行维护了,因此也是不适合作为外部用户生产长期使用的。
因此在 Spring Boot 3.0 于今年年初的第一个 Milestone 版本发布之时,可选的 JDK 版本从上图来看,就只有 JDK 7、8、11 和 17。为什么是 17 而不是其之前的版本呢?这个就要结合 Oracle 官方的 JDK 支持政策来理解了。Oracle 官方一般将所发布的 JDK 后续的支持策略分为以下 3 种:
-
Premier Support: 其可以理解为 Oracle 提供的标准支持类型,其最新政策下的支持时间周期为 5 年,5 年内 Oracle 官方会对该版本 JDK 提供持续免费的更新与升级服务。
-
Extended Support:作为标准支持后的延续支持类型,其最新政策下的支持时间周期为 3 年,3 年内 Oracle 的用户可以通过支付一定的支持服务费用购买 Oracle 对该版本 JDK 所提供的更新支持服务。
-
Sustaining Support:其是 Oracle 官方在延续支持类型后的一种支持服务,当然其也是要收费的,其没有明确的截止时间。
根据上述 Oracle 官方对当前 JDK 所提供的支持服务形式以及 JDK 版本本身的先进性来看,JDK 7、8 已经截止了 Premier Support 支持服务,11 相关的 Premier Support 也快到期了。JDK 17 作为目前最新的 LTS 版本,本身无论是在语法还是运行性能方面都在之前版本基础上做了一定优化,具有比较大的优势。因此,选择 JDK 17 作为最新的 Spring Boot 3.0 的默认 JDK 版本也就顺理成章了!
Spring Cloud 2022.0.0 带来了什么?
Spring Cloud 在 2022 年的最后一个月迎来了 2022.x 系列的第一个正式版本 2022.0.0,有些用户这个时候可能会有一种快结束了才刚刚开始的感觉!其实不然,Spring 在 2022 年的第一个月就推出了 2022.0.0-M1,作为第一个 Milestone 版本。
在接下来一年里,其陆续发布了 5 个 Milestone 和 3 个 Release Candicate(RC) 版本以后,才正式推出最终的 General Available(GA) 版本。由此可见,其实 Spring 官方做事情还是非常靠谱和有耐心的,值得尊敬!
Spring Cloud 作为当前业界应用最为广泛的微服务框架,其定义了一套包含:分布式注册配置中心、分布式消息、限流降级、远程过程调用、负载均衡等在内的较为完整的一套微服务解决方案标准。在 2022.0.0 中,主要做了如下部分内容的调整:
-
Spring Cloud Common 模块中由于 AsyncRestTemplate 已在 Spring Framework 6 中删除,因此删除了对应的 LoadBalancer 自动配置,老代码中有涉及相关内容并考虑升级的用户需要注意。
-
Spring Cloud Common 模块中 LoadBalancer 的 ResponseData 现在已经调整为使用 Spring 中 org.springframework.http.HttpStatusCode,跟 Spring 其他模块保持了一致性。
-
Spring Cloud Common 模块中第一次正式从源码中移除 @SpringCloudApplication注解,@EnableDiscoveryClient、@EnableCircuitBreaker 注解也都不再默认需要添加内容等。
-
Spring Cloud Stream 模块正式移除了对 @StreamListener、@Input 等注解的支持,当前只能使用函数式编程方式进行消息的订阅与发送。
-
Spring Cloud OpenFeign 中 feign.autoconfiguration.jackson.enabled 属性默认改为 true。
更多具体信息可以参考 Spring Cloud 2022.0.0 版本说明 [5 ] 。
Spring Boot 3.0 意味着什么?
Spring Boot 3.0 距离上次大版本 2.0 发布以来,已经过去 4 年半,该版本社区历时 12 个月共提交超过 5700 个 commit。其在 Spring 6.0 和 Spring Native 的基础上主要做了 4 大主要的调整:
-
调整 JDK 基线到 17 版本,兼容 JDK19;
-
将 Java EE 依赖迁移到 Jakarta EE;
-
支持应用使用 GraalVM 技术生成原生镜像,取代了之前实验性质的 Spring Native 项目,让 Spring Boot 应用直接迈向 GraalVM;
-
使用 Micrometer 和 Micrometer Tracing 提升了应用可观测性。
其中,前 2 点前文也有说明,不再赘述。接下来将就其中的 GraalVM 和可观测方面进行介绍。
迈向 GraalVM
Spring Boot 3.0 本次带来最大的改动就是GraalVM原生镜像的支持,也是官方文档中强调的他们花费时间精力比较多的部分。
GraalVM 技术作为 JRE 的替代方案,其通过预先编译(Ahead Of Time,AOT)等技术对 Java 应用进行预先编译,让 Spring 在运行应用时掌握更多应用有关的信息,让整个应用启动速度更快。另外,通过编译工具在编译过程中通过消除一些不必要的内容可以让最终的应用更小,占用内存更低。对于一些对启动速度要求非常高的场景,比如 Serverless、FaaS 场景非常友好!
提到 GraalVM 技术,其最早来自于 Spring 团队于 2019 年发起的 Spring Native 项目。它作为一个实验性质的项目,在过去几年通过与 Sprin