新版本预览
Aliware
本次发布的 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]。
版本解读
Aliware
为什么是 JDK 17?
很多人,听到 Spring Boot 3.0 默认所需的 JDK 最低版本为 17 会感到非常诧异!对很多 JDK 8 用户来说 Spring 官方的选择一定是不明智的。真的是这样的吗?对于这个问题,我们认为主要基于 2 个原因:Oracle 官方对 JDK 支持政策和技术先进性。

因此在 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 版本。

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 项目。它作为一个实验性质的项目,在过去几年通过与 Spring Boot 3.0 和 Spring Framework 6.0 之前的项目进行整合使用,据 Josh Long 在最近的相关采访[6]透露,该实验项目已经验证了 Spring Boot 2.x 和 Spring Framework 5.x 的各项功能。本次 Spring Boot 3.0 直接将其正式从 Spring Native 迁入到 Spring Boot 中来,也预示着该项技术开始逐渐走向成熟,Spring生态开始迈入 GraalVM 阶段!
跟 JVM 编译部署方式相比,GraalVM 具有以下特点:
在应用构建阶段,从主入口点就开始进行应用程序的静态分析。
创建本机镜像时,通过代码分析,会将无法访问的代码删除,并且不会成为可执行文件的一部分,从而可在一定程度上压缩程序包大小。
GraalVM 无法直接感知代码的动态元素,因此对于存在反射、序列化和动态代理的应用程序,需要提前提供相关hint配置文件,帮助解析应用程序,相关操作过程可参考官方文档[7]。
应用程序类路径在构建时是固定的,不能更改。
没有惰性类加载,可执行文件中的所有内容都将在启动时加载到内存中。
支持的 Java 应用程序在某些方面存在一些限制,因此目前并不能保证之前的 Java 应用都可直接使用GraalVM技术进行应用构建,有一定概率会存在不兼容的异常情况。

可观测能力
升级步骤
Aliware
升级操作
如果对于一个 Spring Boot 3.0项目需要使用Spring Cloud Alibaba 2022.0.0.0-RC1 版本,请在项目中添加如下 Management 依赖:
<dependencyManagement><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2022.0.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0-RC1</version><type>pom</type><scope>import</scope></dependency></dependencyManagement>
兼容 Spring Boot 3.0 & Spring Cloud 2022.0.0
Spring Cloud Alibaba项目作为阿里巴巴中间件微服务领域的一站式解决方案,在本次发布的 2022.0.0.0 版本适配过程中,由于Spring Boot & JDK的较大变化给项目适配造成了除功能升级以外的大量其他兼容性工作。如果是直接构建新项目,可以参考最新的 Spring Boot 3.0 项目构建过程进行操作即可,以下步骤可以省略,如果是老的应用希望升级到 JDK17 & Spring Boot 3.0 可能需要做如下一些兼容处理:
OpenRewrite recipes[12]. The Spring Boot Migrator project[13]. Migration support in IntelliJ IDEA[14].
com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfigurationcom.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfigurationcom.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfigurationcom.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfigurationcom.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfigurationcom.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfigurationcom.alibaba.cloud.nacos.loadbalancer.LoadBalancerNacosAutoConfigurationcom.alibaba.cloud.nacos.NacosServiceAutoConfigurationcom.alibaba.cloud.nacos.utils.UtilIPv6AutoConfiguration
@GetMapping("/hello")String hello() {return "Hello World";}
@SpringBootApplicationpublic class RocketMQBroadcastConsumer2Application {private static final Logger log = LoggerFactory.getLogger(RocketMQBroadcastConsumer2Application.class);public static void main(String[] args) {SpringApplication.run(RocketMQBroadcastConsumer2Application.class, args);}@Beanpublic Consumer<Message<SimpleMsg>> consumer() {return msg -> {log.info(Thread.currentThread().getName() + " Consumer2 Receive New Messages: " + msg.getPayload().getMsg());};}}
新特性以及使用方式
Aliware
使用 GraalVM 技术构建应用
本次适配 Spring Boot 3.0 的 Spring Cloud Alibaba 所支持的所有组件中,Nacos 2.2.1-RC 已经支持 GraalVM 技术构建应用。接下来,将介绍一下相关组件使用 GraalVM 技术进行应用编译与运行测试:
项目构建
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.0</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId></dependency><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2022.0.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0-RC1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>
使用 Spring Boot 对 Cloud Native Buildpacks 的支持来生成包含本机可执行文件的轻量级容器。 使用 GraalVM Native Build Tools 生成本机可执行文件。
环境准备
sdk install java 22.3.r17-niksdk use java 22.3.r17-nik
$ java -versionopenjdk version "17.0.5" 2022-10-18 LTSOpenJDK Runtime Environment GraalVM 22.3.0 (build 17.0.5+8-LTS)OpenJDK 64-Bit Server VM GraalVM 22.3.0 (build 17.0.5+8-LTS, mixed mode)
资源文件准备
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><jvmArguments>-agentlib:native-image-agent=config-merge-dir=src/main/resources/META-INF/native-image/</jvmArguments></configuration></plugin><plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId></plugin></plugins></build>
mvn -Pnative spring-boot:run
resource-config.json:应用中资源 hint 文件 reflect-config.json:应用中反射定义 hint 文件 serialization-config.json:应用中序列化内容 hint 文件 proxy-config.json:应用中 Java 代理相关内容 hint 文件 jni-config.json:应用中 Java Native Interface(JNI)内容 hint 文件
编译原生应用
mvn -Pnative native:compile
Finished generating 'nacos-discovery-provider-example' in 2m 36s.[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 02:51 min[INFO] Finished at: 2022-12-21T13:43:22+08:00[INFO] ------------------------------------------------------------------------
...... : [REGISTER-SERVICE] public registering service DEFAULT_GROUP@@service-provider with instance: Instance{instanceId='null', ip='30.221.144.116', port=18082, weight=1.0, healthy=true, enabled=true, ephemeral=true, clusterName='DEFAULT', serviceName='null', metadata={preserved.register.source=SPRING_CLOUD}}...... : null No credential found...... : nacos registry, DEFAULT_GROUP service-provider 30.221.144.116:18082 register finished...... : Started ProviderApplication in 0.328 seconds (process running for 0.339)

升级建议与注意事项
1. 此次支持 Spring Boot 3.0 的 Spring Cloud Alibaba 版本相关内容改动整体还是比较大的,老项目特别是 Spring Boot 2.4 以下的直接迁移存在一定的兼容性风险,建议相关迁移操作先进行充分验证和测试以后再进行。
社区未来规划
Aliware

相关链接
Aliware





