Dubbo 正式支持 Spring 6 & Spring Boot 3

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 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 版本在

背景

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。


以下列出了一系列工具可以帮助你完成这部分的迁移:


  • OpenRewrite recipes.
  • The Spring Boot Migrator project.
  • Migration support in IntelliJ IDEA.

移除 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.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,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/10/11/embracing-virtual-threads

支持 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 的预热问题
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
58 2
|
3月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
86 0
|
18天前
|
Dubbo Java 应用服务中间件
深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案
本文深入探讨了“dubbo+nacos+springboot3的native打包成功后运行出现异常”的原因及解决方案。通过检查GraalVM版本兼容性、配置反射列表、使用代理类、检查配置文件、禁用不支持的功能、查看日志文件、使用GraalVM诊断工具和调整GraalVM配置等步骤,帮助开发者快速定位并解决问题,确保服务的正常运行。
32 1
|
1月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
54 19
|
1月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
67 2
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
109 1
|
1月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
28 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
1月前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
27 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
1月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
88 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
182 2
下一篇
无影云桌面