乐趣区

关于阿里云:Dubbo-正式支持-Spring-6-Spring-Boot-3

作者:Dubbo 社区

Dubbo 简介

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官网提供了 Java、Golang 等多语言 SDK 实现。应用 Dubbo 开发的微服务原生具备相互之间的近程地址发现与通信能力,利用 Dubbo 提供的丰盛服务治理个性,能够实现诸如服务发现、负载平衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩大,用户能够不便的实现流量拦挡、选址的各种定制逻辑。

背景

Spring Framework 6.0 于 11 月 16 日正式公布 GA 版本,Spring Boot 3.0 也于 11 月 25 日正式公布 GA 版本,并且 Spring 6 & SpringBoot 3 最低反对 JDK17,意味着如果降级应用 Spring 6 & Spring Boot 3 时就必须须要降级应用 JDK17。

然而 Java 8 目前是国内支流生产环境 Java 版本之一。尽管近几年陆续公布了 Java 11、Java 17 官网 LTS 版本,然而大部分开发者仍然本着“你发任你发,我用 Java8”的认识对待 JDK 的降级。不过 Java 17 版本在性能上的确做了大量的优化特地是 ZGC 的公布,促成了国内不少企业降级到 Java 17。

而 Spring 框架在 Java 生态中的重要水平显而易见,咱们置信在 Spring 这波“最低反对 JDK17”推动下,Spring Framework 6.0 & Spring Boot 3.0 肯定会在不久的未来被大家承受,并成为支流技术栈。

Dubbo 社区非常重视 Spring 社区的更新迭代,总会积极支持适配,这点在最近 Spring 6.0 和 Spring Boot 3.0 公布中同样失去了验证。Dubbo 社区早在 Spring 6.0.0-RC4 和 Spring Boot 3.0.0-RC2 时曾经做好了大抵的兼容适配,然而为了保障 Dubbo 可能齐全适配 Spring 6 和 Spring Boot 3.0 的正式版,咱们始终等到 Spring Boot 3.0 GA 后,才抉择发表这个令人高兴的事件。

为什么要降级到 Spring 6.0 & Spring Boot 3.0

首先是,降级到 Spring 6.0 & Spring Boot 3.0 将取得将来很长年限的由官网提供的收费技术撑持。Spring 6 和 Spring Boot 3 是 Spring 下一代技术框架基石,只管官网以后同时保护了 Spring 5.3 和 Spring Boot 2.6.x 和 Spring Boot 2.7.x,但它们最终都会在 2025 年和 2026 年完结其 OSS support(Open Source Software Support)。

其次是,您将在新一代框架中取得大量新特新,这些新个性都能够在 Spring Boot 3.0 Release Notes [ 1] 和 What’s New in Spring Framework 6.x [2 ]  中取得。

最初是,Spring 6.x 和 Spring Boot 3.x 将会最宽泛的反对 JDK 17-29,须要额定阐明的是 JDK17 作为以后最新的 LTS 版本,它提供了一组累积的最新语言、API 和 JVM 加强性能,使其成为更具吸引力的编译版本的降级,这也是为什么最低反对 JDK17 的起因。

Dubbo 反对 Spring 6 & Spring Boot 3

当初很快乐向大家发表,Dubbo 曾经开始兼容 Spring 6 & Spring Boot 3,所以以后 Dubbo 3.2.0-beta.3 版本能够同时兼容反对 Spring Boot 1.x、2.x、3.x。您当初能够应用 dubbo-3.2.0-beta.3 版本体验其兼容性。

<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>3.2.0-beta.3</version>
</dependency>

更多对于 Spring Boot 3.0 集成 Dubbo 应用示例可参见 apache/dubbo-sample:

https://github.com/apache/dub…

降级总结

咱们依据 Dubbo 兼容适配 Spring 6 & Spring Boot 3 过程中总结的教训整顿如下,其余组件维护者也能够参考以下教训进行适配或者降级,更早适配降级到最新版本:

Jakarta EE

Jakarta EE 9 将所有 API 包名从 javax. 命名空间变更到了 jakarta.。而造成这一变动的起因是 Oracle 回绝交出相干权利,详情能够查看:

https://www.oschina.net/news/…

因为 Jakarta EE 的迁徙,对于 Web Apps,确保降级应用 Tomcat 10, Jetty 11, or Undertow 2.2.19。

以下列出了一系列工具能够帮忙你实现这部分的迁徙:

  • OpenRewrite recipes [3 ] .
  • The Spring Boot Migrator project [4 ] .
  • Migration support in IntelliJ IDEA [5 ] .

移除 META-INF/spring.factories 文件对 Auto-configuration 的反对

Spring Boot 3.0 移除了 META-INF/spring.factories 文件对 Auto-configuration 的反对,为了兼容性,SpringBoot 2.7.x 是最初一个反对的版本。

适配反对依照上面两个步骤即可实现

Step1:[可选] 应用 @AutoConfiguration 注解代替 @Configuration(proxyBeanMethods = false)

@AutoConfiguration 注解是 SpringBoot 2.7 中的新引入的注解,旨在专门标识 Auto-configuraton class name。

仍然应用 @Configuration 注解标识主动适配类也是能够的,Dubbo 正是基于这个便当点完满反对了 Spring Boot 1.x、2.x、3.x 所有版本。

Step2:应用 AutoConfiguration.imports 文件代替 META-INF/spring.factories 文件

Spring Boot 2.7 是最初一个仍然兼容应用 spring.factories 的版本,SpringBoot 3 当前不再兼容,此时您应该应用 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件替换。

在该文件列举你所有的 configuration classes,每行一个 class name,例如:

com.mycorp.libx.autoconfigure.LibXAutoConfiguration
com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration

为了对齐 ISO-8601,应用 yyyy-MM-dd’T’HH:mm:ss.SSSXXX 作为默认日志日期格局

原来默认日志日期格局:yyyy-MM-dd HH:mm:ss.SSS
以后默认日志日期格局:yyyy-MM-dd’T’HH:mm:ss.SSSXXX

原来的默认日志日期格局不具备 timezone / offset 信息。

yyyy-MM-dd'T'HH:mm:ss.SSSXXX >>> e.g.: 2014-12-03T10:06:04.646+08:00

移除 YamlJsonParser

Spring Boot 官网测试发现 YamlJsonParser 并不能很好的解析 JSON,Spring Boot 3 决定不再反对应用它来作为解析 JSON 的备选。

YamlJsonParser 封装的是 snakeyaml。

Spring Boot 3 解析 JSON 的解析器应用优先级如下:

  • 1)JacksonJsonParser
  • 2)GsonJsonParser
  • 3)BasicJsonParser

移除 spring.session.store-type 配置键

移除了 spring.session.store-type 配置项,当存在多个可用存储库,将会依照 Redis,JDBC,Hazelcast,Mongo 程序应用。

更新 Spring data 配置键使其分明地反应该配置键是否依赖 Spring Data

如果存储库(redis、mongo 等)相干的配置键不依赖 Spring Data 存在,则只须要 spring 前缀,否则须要应用 spring.data 前缀。

举例说明:

spring.redis.host >> spring.data.redis.host

spring.redis.port >> spring.data.redis.port

spring.data.cassandra.port >> spring.cassandra.port

重构 HttpMethod 枚举为类

依据最新的 rfc2616 [6 ],HTTP Method 曾经属于不可枚举属性,所以重构 HttpMethod enum 类为 class 类。

除了咱们熟知的 GET, HEAD, PUT, POST 等办法,当初还存在了可扩大办法,以后可扩大办法蕴含了 LOCK, COPY, 和 MOVE。这些扩大办法定义在 WebDAV。

不容许 URI 尾部斜杠匹配

Spring 6 之前,拜访“/resources”和“/resources/”都能够进入 resources() 办法。

@GetMapping("/resources")
String resources() {return "Hello from /resources";}

Spring 6 之后,您只能通过看到的 path“/resources”进入 mapping 办法。

如果您仍然想让“/resources/”和“/resources”进入雷同的 mapping 办法,能够通过其余伎俩,诸如“反向代理”、“Servlet/Web 过滤器”或“在控制器配置显式重定向”。

提供基于 @HttpExchange  服务接口的 HTTP 客户端

Spring 6 介绍了 @HttpExchange 注解,基于 @HttpExchange 注解能够简化 HTTP 近程调用。

加强 Spring SPI 加载器 SpringFactoriesLoader 容许加载多自定义文件

Spring 6 之前,SpringFactoriesLoader 只容许加载 ”META-INF/spring.factories” 文件内容。

Spring 6 之后,SpringFactoriesLoader 能够加载自定义文件或文件名文件,并且能够通过链式编程加载多个文件。

晚期兼容 JDK19 预览版的虚构线程(virtual threads)

能够在 Spring 6 和 Spring Boot 3 中应用虚构线程解决申请来提前体验。

这部分具体阐明参见:

https://spring.io/blog/2022/1…

反对 RFC 7807 Problem Details

Spring 6 当前,Spring MVC 能够应用 application/problem+json media 类型自定义 错误信息响应体,像上面这样:

{
  "type": "https://example.org/problems/unknown-project",
  "title": "Unknown project",
  "status": 404,
  "detail": "No project found for id'spring-unknown'","instance":"/projects/spring-unknown"
}

瞻望

在云原生时代,Java 的跨平台个性,曾经不算是其亮眼个性了,而其 Jar 包体积大、启动慢、占用内存多、须要另装 JVM 是 Java 利用的痛点问题。

而通过应用 GraalVM 能够很好的解决这些问题。并且通过 GraalVM 的 AOT(Ahead-Of-Time)能够将利用编译成独自可执行文件并间接运行。

将来 Dubbo 将会踊跃地在 Native 方面做一些工作以此可能使应用程序达到上面的指标:

  • 反对 Spring & Spring Boot native-image
  • 较小的本地应用程序和容器镜像占用空间
  • 疾速启动,疾速启动(几十毫秒)
  • 低内存耗费,缩小 RSS(驻留集大小),低内存有助于优化须要多个容器的微服务架构部署中的容器密度
  • 疾速的第一申请响应,防止 Hotspot 的预热问题

相干链接

[1] Spring Boot 3.0 Release Notes:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes

[2] What’s New in Spring Framework 6.x:

https://github.com/spring-pro…

[3] OpenRewrite recipes

https://docs.openrewrite.org/reference/recipes/java/migrate/javaxmigrationtojakarta

[4] The Spring Boot Migrator project

https://github.com/spring-pro…

[5] Migration support in IntelliJ IDEA

https://blog.jetbrains.com/id…

[6] rfc2616

https://datatracker.ietf.org/…

退出移动版