首页 > 其他分享 >Apache Dubbo 官方正式发布 Spring 6 & Spring Boot 3 支持

Apache Dubbo 官方正式发布 Spring 6 & Spring Boot 3 支持

时间:2022-12-23 16:23:42浏览次数:56  
标签:Dubbo Java spring Boot 3.0 Spring

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-RC4Spring 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 Noteshttps://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes)What's New in Spring Framework 6.xhttps://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.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 的预热问题

欢迎在 https://github.com/apache/dubbo 给 Dubbo Star。

标签:Dubbo,Java,spring,Boot,3.0,Spring
From: https://www.cnblogs.com/apache-dubbo/p/17000945.html

相关文章