Spring Cloud Alibaba Blog | https://sca.aliyun.com Spring Cloud Alibaba Blog
文档
社区
联系我们
学习
解决方案
中文

2022.0.0.0-RC1 版本发布啦

铖朴

摘要

基于 GraalVM 对 Java 应用进行运行前的静态编译优化,能显著地解决 Java 应用长期被诟病的冷启动耗时长、运行时占用内存大的问题,实现降本增效!本文将介绍如何使用 Spring Cloud Alibaba 2022.0.0.0-RC1 版本,以及其如何使用 GraalVM 对 Spring Cloud Alibaba 应用进行静态编译优化。

新版本预览

本次发布的 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 版本出现以后,官方就不会对其进行维护了,因此也是不适合作为外部用户生产长期使用的。 image.png 因此在 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 版本。 image.png 在接下来一年里,其陆续发布了 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 版本说明

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 在最近的相关采访透露,该实验项目已经验证了 Spring Boot 2.x 和 Spring Framework 5.x 的各项功能。本次 Spring Boot 3.0 直接将其正式从 Spring Native 迁入到 Spring Boot 中来,也预示着该项技术开始逐渐走向成熟,Spring 生态开始迈入 GraalVM 阶段! 跟 JVM 编译部署方式相比,GraalVM 具有以下特点:

  • 在应用构建阶段,从主入口点就开始进行应用程序的静态分析。
  • 创建本机镜像时,通过代码分析,会将无法访问的代码删除,并且不会成为可执行文件的一部分,从而可在一定程度上压缩程序包大小。
  • GraalVM 无法直接感知代码的动态元素,因此对于存在反射、序列化和动态代理的应用程序,需要提前提供相关 hint 配置文件,帮助解析应用程序,相关操作过程可参考官方文档
  • 应用程序类路径在构建时是固定的,不能更改。
  • 没有惰性类加载,可执行文件中的所有内容都将在启动时加载到内存中。
  • 支持的 Java 应用程序在某些方面存在一些限制,因此目前并不能保证之前的 Java 应用都可直接使用 GraalVM 技术进行应用构建,有一定概率会存在不兼容的异常情况。

本次发布的 Spring Cloud Alibaba 2022.0.0.0-RC1 版本所包含的部分中间件客户端已完成了构建 GraalVM 原生应用的适配,以下是社区对目前所支持的服务注册与发现、分布式事务模块相关示例应用在升级为 Spring Boot 3.0 以后,使用 GraalVM 构建原生应用镜像做的在启动速度和运行时占用内容相关的测试(Sentinel 和 RocketMQ 目前还在适配中,以下测试过程在 MacOS 11.4,2.6 GHz 6-Core Intel Core i7 处理器,16G 内存环境下分别模拟 5 次取平均值测得): image.png 从上述对比可发现,最新支持 Spring Boot 3.0 基于 GraalVM 的 Spring Cloud Alibaba 应用会在启动速度、运行时内存占用和应用包大小方面得到大幅度降低,例如,其中服务注册消费应用启动速度提升了近 10 倍,运行时内存占用比原来降低了近乎 2/3,效果非常明显。这给云原生时代,托管在云上的应用带来了显著优势,让其可以更快的进行弹性扩缩容以及降低企业整体用云成本!

可观测能力

微服务应用带来了系统的解耦,把一个应用拆分成若干个模块来进行部署,这样在提高系统的可扩展性的同时,一个请求的处理可能会经过多个单独部署的模块,因此,让问题排查显著提升。可观测技术通过定义 logging、metrics 和 traces 3 个维度指标数据的采集和处理,让系统运维人员可以方便地掌握系统运行状态,及时排查解决问题。 Spring Boot 3.0 中另外一项重大特性,就是其在可观测领域的增强。在 Spring Boot 3.0 中,支持了可观测事实标准 Micrometer 1.10 中引入的新 API。例如,Spring Boot 3.0 可自动装配一个 ObservationRegistry 实例对象,为用户提供一个同时适用于 metrics 和 traces 的 API 接口。另外,3.0 也为用户提供了自动配置 Micrometer Tracing 功能,具体包括支持第三方的相关可观测工具,如:Brave、OpenTelemetry、Zipkin 以及 Wavefront。让 Spring Boot 应用能非常方便的集成各种主流的可观测工具。更多有关可观测的内容可参见相关文档说明。 除了上述介绍的主要特性以外, Spring Boot 3.0 还解决很多之前存在的 bug,更多具体内容可参见 Spring Boot 3.0 版本说明

升级步骤

升级操作

如果对于一个 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>

注意除了调整上述 JDK 版本,还需要将 JDK 版本升级到 17。

兼容 Spring Boot 3.0 & Spring Cloud 2022.0.0

Spring Cloud Alibaba 项目作为阿里巴巴中间件微服务领域的一站式解决方案,在本次发布的 2022.0.0.0-RC1 版本适配过程中,由于 Spring Boot & JDK 的较大变化给项目适配造成了除功能升级以外的大量其他兼容性工作。如果是直接构建新项目,可以参考最新的 Spring Boot 3.0 项目构建过程进行操作即可,以下步骤可以省略,如果是老的应用希望升级到 JDK17 & Spring Boot 3.0 可能需要做如下一些兼容处理: Java EE 依赖迁移到 Jakarta EE 由于 Oracle 跟 Eclipse 基金会在 Java EE 商标上所存在的纠纷,从 Jakarta EE 9 开始, javax._ 包下的基础类都被迁移到了 jakarta.__。因此,对于本次升级如果在程序中使用了 javax._* 开头的导包,都需要将其进行修改。 以下列出了一系列工具可以帮助你完成这部分的迁移:

spring.factories 文件不再支持对 Auto-configuration 进行自动装配 从 Spring Boot 3.0 开始,META-INF/spring.factories 文件不再支持对 Auto-configuration 进行自动装配。用户可以使用 AutoConfiguration.imports 文件代替 META-INF/spring.factories 文件对原来编写在其中的自动装配类进行迁移。如果不做对应的修改,直接升级你会发现之前程序运行阶段自动注入的对象都将不存在导致运行报错。这个也是本次 Spring Cloud Alibaba 所使用的方式,如本次 Spring Cloud Alibaba 升级过程中服务注册与发现模块就通过创建如下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 进行自动类装配:

com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration
com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration
com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration
com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration
com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration
com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration
com.alibaba.cloud.nacos.loadbalancer.LoadBalancerNacosAutoConfiguration
com.alibaba.cloud.nacos.NacosServiceAutoConfiguration
com.alibaba.cloud.nacos.utils.UtilIPv6AutoConfiguration

不在允许 URI 尾部斜杠匹配 在 Spring 6 以前,请求路径使用”/hello”和”/hello/“都可以进入如下到 hello()方法,但是在升级以后需要注意只有前者请求才能正常被配到到方法中,后者会抛出 404 找不到匹配路径异常。

@GetMapping("/hello")
String hello() {
return "Hello World";
}

Spring Cloud Stream 注解使用方式被移除 Spring Cloud Stream 作为 Spring Cloud 体系内集成具有高度可扩展性的分布式消息解决标准实现,Spring Cloud Alibaba 基于其将 RocketMQ 集成进入了 Spring Cloud 生态,让用户可以不用修改一行业务代码仅调整依赖和配置即可进行消息中间件从 RabbitMQ、Kafka 等迁移到 RocketMQ。在 Spring Cloud 2022.0.0 最新版本所对应的 Spring Cloud Stream 4.0 中移除之前的注解方式在客户端处理消息能力,目前仅支持函数式方式。 因此,像之前的@StreamListener� 和@Input� 等注解在升级以后都不再能直接使用。目前,Spring Cloud Alibaba 中 RocketMQ 相关模块示例代码已调整为函数方式,函数式方式让代码编写过程变得更加简洁,以下为使用函数式方式完成广播消息的消费代码,更多示例可参考相关示例模块

@SpringBootApplication
public class RocketMQBroadcastConsumer2Application {
private static final Logger log = LoggerFactory
.getLogger(RocketMQBroadcastConsumer2Application.class);
public static void main(String[] args) {
SpringApplication.run(RocketMQBroadcastConsumer2Application.class, args);
}
@Bean
public Consumer<Message<SimpleMsg>> consumer() {
return msg -> {
log.info(Thread.currentThread().getName() + " Consumer2 Receive New Messages: " + msg.getPayload().getMsg());
};
}
}

Spring Cloud Common 模块正式移除@SpringCloudApplication� 注解 在 Spring Cloud 2022.0.0 所对应的 Spring Cloud Common 4.0.0 中正式移除@SpringCloudApplication 注解。该注解的推出是为了包含@SpringBootApplication、@EnableDiscoveryClient、@EnableCircuitBreaker 这 3 个 Spring Cloud 应用都必要的注解分别提供应用依赖管理,服务注册和断路器包含。在后来通过引入相关的依赖就可默认提供服务注册以及断路器能力,因此这两个注解也不再必须,通过配置 spring.cloud.discovery.enabled=false 可直接关闭默认注册行为,相关注册方式这样操作更加灵活,这次在新版本中@SpringCloudApplication 正式被移除,升级过程中老版本需要注意进行相应的调整。

上述内容是 Spring Cloud Alibaba 适配 JDK 17 & Spring 6 & Spring Boot 3.0 & Spring Cloud 2022.0.0 过程中框架层面比较直接的一些变动。其他的一些相关新版本所带来的更多特性和改变可详细参考相关文档 Spring 6Spring Boot 3.0Spring Cloud 2022.0.0。另外在适配支持 GraalVM 技术构建 Spring Cloud Alibaba 应用原生镜像方式,社区了也联合 Nacos、Sentinel、Seata 等社区共同做了一些改造和兼容。具体在新特性使用介绍中会有提及。

新特性以及使用方式

使用 GraalVM 技术构建应用

本次适配 Spring Boot 3.0 的 Spring Cloud Alibaba 所支持的所有组件中,Nacos 2.2.1-RC 已经支持 GraalVM 技术构建应用。接下来,将介绍一下相关组件使用 GraalVM 技术进行应用编译与运行测试:

项目构建

按照一般的 Spring Cloud Alibaba 应用构建方式进行项目构建即可,以下为相关必须添加的依赖内容:

<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 Cloud Alibaba 使用 Nacos 进行服务注册所需要的必要依赖,其他依赖请根据自身需求进行调整,请注意,使用 GraalVM spring-boot-starter-parent 父模块是非常关键的,其声明一个 native profile,其中包含了创建、运行 GraalVM 原生映像的必要信息。 构建 Spring Boot 原生镜像应用主要有两种方式:

  1. 使用 Spring Boot 对 Cloud Native Buildpacks 的支持来生成包含本机可执行文件的轻量级容器。
  2. 使用 GraalVM Native Build Tools 生成本机可执行文件。

由于第一种方式使用过程中对本地环境有一定的要求,如需使用可参考 Spring Boot 3.0 相关用户文档。本文接下来演示使用第二种方式进行 GraalVM 应用构建。

环境准备

要使用 Native Build Tools 构建原生镜像,需要在首先在机器上安装 GraalVM 发行版。 您可以在 Liberica Native Image Kit 页面上手动下载它,也可以使用像 SDKMAN! 这样的下载管理器。本文演示环境为 MacOS,如果是 Windows 可参考相应文档进行操作。执行以下命令安装 GraalVM 环境:

sdk install java 22.3.r17-nik
sdk use java 22.3.r17-nik

通过检查 java -version 的输出来验证是否配置了正确的版本:

$ java -version
openjdk version "17.0.5" 2022-10-18 LTS
OpenJDK 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)

资源文件准备

在构建应用之前,需要在应用 pom.xml 文件中添加如下相关构建工具插件。

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

添加完上述插件后,通过以下命令生成应用中反射、序列化和动态代理所需的 hint 配置文件。

mvn -Pnative spring-boot:run

运行成功以后,停止应用以后,可发现项目 resource/META-INF/native-image 目录下会生成以下一些 hint 文件:

  • 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 文件

由于 GraalVM 无法直接感知代码的动态元素,因此需要这些 hint 原生帮助生成的原生应用镜像进行运行。 注意:执行以上命令启动应用进行应用属性解析的过程是动态的,在该阶段需要完整测试一遍应用的所有功能才能确保完整生成应用运行过程中的所有必须动态属性,否则会出现生成的配置文件中内容不完整造成运行阶段报错。社区在适配 Nacos 服务注册与消费测试过程中就因为测试不充分导致过类似错误。

编译原生应用

上述步骤一切就绪以后,通过以下命令进行原生应用构建:

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] ------------------------------------------------------------------------

接下来我们通过 target/nacos-discovery-provider-example 启动应用,如下图显示结果可见,启动速度非常迅速,仅 0.3s 多就完成了应用启动和服务注册:

...... : [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)

另外,我们可以通过 vmmap pid | grep Physical 命令查看运行过程中的内存占用情况: image.png 以上过程则为一个 Spring Cloud Alibaba 应用使用 GraalVM 技术构建应用并完成向 Nacos 注册的整个过程,相关示例代码可以参考 SCA Nacos Example。特别需要注意的是,OpenFeign 使用 GraalVM 过程中需要进行一些调整,比如添加 spring.cloud.refresh.enabled=false� 配置,具体设置过程可参考相关 OpenFeign 说明文档

升级建议与注意事项

  1. 此次支持 Spring Boot 3.0 的 Spring Cloud Alibaba 版本相关内容改动整体还是比较大的,老项目特别是 Spring Boot 2.4 以下的直接迁移到存在一定的兼容性风险,建议相关迁移操作先进行充分验证和测试以后再进行。
  2. 此次引入 Spring Boot 3.0 中的 GraalVM 技术在应用启动速度、运行时内存占用率和包大小方面相比于传统的 JVM 虚拟机模式有非常显著的优势,在一定程度上解决 Java 语言一直被诟病的启动速度慢、构建包过大等问题。但相关技术目前也还在发展中,段时间内还有一定问题需要处理,比如本次发布的 Spring Cloud Alibaba 版本中除了服务注册与发现和分布式事务模块实现了初步的 GraalVM 支持,其他模块或多或少存在一些问题还无法直接使用 GraalVM,这块社区也在持续努力中。

社区未来规划

目前,本次发布的 Spring Cloud Alibaba 版本初步实现了对 GraalVM 支持,Sentinel/Seata/RocketMQ 等模块也正在火热支持中,社区也会在后续完成兼容适配以后进行发布,这块也是未来 2022.x 分支的短期工作重心!大家目前可以先通过社区 Examples 模块完成新版本的功能体验,云原生应用脚手架对 Spring Cloud Alibaba 的 2022.0.0.0-RC1 版本的支持也会在近期支持上线,届时大家可以通过 start.aliyun.com 更加便捷的构建新应用,云原生应用脚手架是一款基于 Spring Initializr 项目基础之上,支持多种工程架构、提供代码示例片段、组件更丰富、生态更开放的一款脚手架。其致力于在当下云原生时代,为广大开发者提供更简单、更高效的项目构建体验。目前该项目已经开源,Github 地址是 https://github.com/alibaba/cloud-native-app-initializer。 另外在未来,Spring Cloud Alibaba 社区的工作重心会投入到构建 Spring Cloud 生态的微服务治理能力上。当前社区已经基于 Istio VirtualService 和 DestinationRule 流量以及安全规范实现了标签路由和服务鉴权等能力,在未来用户仅需通过编写 CRD 规则通过 Istio 控制面进行解析和下发到系统中的 Spring Cloud Alibaba 应用。便可轻松具备原生微服务治理能力。欢迎感兴趣的同学扫描下方钉钉二维码加入社区交流群,一起参与社区未来建设! image.png