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(https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes) 和 What's New in Spring Framework 6.x(https://github.com/spring-projects/spring-framework/wiki/What's-New-in-Spring-Framework-6.x) 中获得。
最后是,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.2 版本可以同时兼容支持Spring Boot 1.x、2.x、3.x。您现在可以使用dubbo-3.2.0-beta.2
版本体验其兼容性。
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>3.2.0-beta.2</version>
</dependency>
更多关于Spring Boot 3.0 集成 Dubbo 使用示例可参见apache/dubbo-sample:https://github.com/apache/dubbo-samples/tree/master/1-basic
升级总结
我们根据Dubbo 兼容适配Spring 6 & Spring Boot 3 过程中总结的经验整理如下,其他组件维护者也可以参考以下经验进行适配或者升级,更早适配升级到最新版本:
Jakarta EE
Jakarta EE 9 将所有API包名从javax.*
命名空间变更到了jakarta.*
。而造成这一变化的原因是Oracle拒绝交出相关权益,详情可以查看:https://www.oschina.net/news/106465/oracle-killed-java-ee。
因为Jakarta EE 的迁移,对于Web Apps,确保升级使用Tomcat 10, Jetty 11, or Undertow 2.2.19。
以下列出了一系列工具可以帮助你完成这部分的迁移:
移除META-INF/spring.factories文件对Auto-configuration的支持
Spring Boot 3.0移除了META-INF/spring.factories
文件对Auto-configuration的支持,为了兼容性,SpringBoot 2.7.x 是最后一个支持的版本。
适配支持按照下面两个步骤即可完成
Step1: [可选] 使用 @AutoConfiguration 注解代替 [@Configuration(proxyBeanMethods ](/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.i