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。

Apache Dubbo 官方正式发布 Spring 6 & Spring Boot 3 支持的更多相关文章

  1. Apache Dubbo Provider默认反序列漏洞复现(CVE-2020-1948)

    Apache Dubbo Provider默认反序列漏洞(CVE-2020-1948) 0x01 搭建漏洞环境 漏洞介绍 2020年06月23日, 360CERT监测发现Apache Dubbo 官方 ...

  2. (转)阿里官方提供的dubbo-spring-boot-starter 1.0.1 整合的dubbo 2.6.0和spring boot 1.5.9 案例

    作者:许浩_5e9f链接:https://www.jianshu.com/p/5381cc8876e3來源:简书著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. springboo ...

  3. Spring Boot 整合 Apache Dubbo

    Apache Dubbo是一款高性能.轻量级的开源 Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 注意,是 Apache Dubb ...

  4. 如何使用Dubbo 2.7.0和Spring boot实现FAT测试(Feature Acceptance Test)

    在一个调用链非常长的功能中,如果想修改其中的一个特性,并进行测试,而又不影响该环境的其他用户使用现有功能.特性,例如: 1. A.B.C.D之间通过Dubbo实现远程调用 2. 这些模块可能有一个或者 ...

  5. 【Spring】关于Boot应用中集成Spring Security你必须了解的那些事

    Spring Security Spring Security是Spring社区的一个顶级项目,也是Spring Boot官方推荐使用的Security框架.除了常规的Authentication和A ...

  6. 阿里Dubbo疯狂更新,关Spring Cloud什么事?

    最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本. 我上次在写放弃Dubbo,选择最流行的Spring ...

  7. [Spring] 学习Spring Boot之一:基本使用及简析

    一.简介 使用 Spring Boot 目的主要是用来简化 Spring 应用的搭建及开发过程,因为使用 Spring 及 SpringMVC 框架时需要手动配置的地方非常多(各种包之间的依赖.各种配 ...

  8. 转 阿里Dubbo疯狂更新,关Spring Cloud什么事?

    原文地址: http://www.ityouknow.com/springcloud/2017/11/20/dubbo-update-again.html阿里Dubbo疯狂更新,关Spring Clo ...

  9. Spring boot-(2) Spring Boot使用

    1. 构建系统 (1) 使用maven构建 1) 从Starter Parent继承 在项目中配置继承spring-boot-starter-parent,可以进行如下设置: <!-- Inhe ...

  10. Bean 装配,从 Spring 到 Spring Boot

    目录  从SSM的集成谈到Bean的装配  Bean的装配 由XML到Java Config 自动扫描 Bean的注入 SSM集成的Java版 Spring Boot Magic Auto Confi ...

随机推荐

  1. 计算机三大硬件和操作系统以及python解释器

    今日分享内容概要 计算机五大组成部分详解 计算机三大核心硬件 操作系统 编程与编程语言 编程语言的发展历史 编程语言的分类 python解释器 python解释器多版本共存 分享详细 计算机五大组成部 ...

  2. 【Wine使用经验分享】Wine字体显示问题处理

    字体不显示/字体为□ 首先尝试下载simsun字体到/usr/share/fonts (simsun.ttf simsun.ttc) 在新版本wine上,差不多就能解决问题. 如果还不行,就从网上下载 ...

  3. POJ1734 Sightseeing trip (Floyd求最小环)

    学习了一下用Floyd求最小环,思路还是比较清晰的. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring ...

  4. 17.MongoDB系列之了解应用程序动态

    1. 查看当前操作 mongos> db.currentOp() { "inprog" : [ { "shard" : "study" ...

  5. 2、yaml配置文件当中的坑(数字的定义和支持进制书写格式)

    6.进制数的转换 6.1.问题回顾 我记得我刚刚开始使用SpringBoot的时候,有一天在做到SpringBoot整合第三方技术的时候 我刚好在那天学习到整合Mybatis,做Web项目嘛,不连数据 ...

  6. 中国制霸生成器「GitHub 热点速览 v.22.42」

    火遍推特的中国制霸生成器本周一开源就占据了两天的 GitHub Trending 榜,不知道你的足迹遍布了多少个省份呢?同样记录痕迹的 kanal 用了内存读写方式解决了 Rust 的消息处理问题,P ...

  7. 从 Wepy 到 UniApp 变形记

    作者:vivo 互联网前端团队-Wan Anwen.Hu Feng.Feng Wei.Xie Tao 进入互联网"下半场",靠"人海战术"的研发模式已经不再具备 ...

  8. pod(八):pod的调度——将 Pod 指派给节点

    目录 一.系统环境 二.前言 三.pod的调度 3.1 pod的调度概述 3.2 pod自动调度 3.2.1 创建3个主机端口为80的pod 3.3 使用nodeName 字段指定pod运行在哪个节点 ...

  9. Java读取txt文件、excel文件的方法

    Java读取txt文件.excel文件的方法 1.读取txt文件 public static String getFileContent(String filePath,String charset) ...

  10. PHP使用PHPmailer类和smtp发送邮件

    开启邮件smtp服务 设置授权码 引入phpmailer类,smtp类本地下载https://github.com/PHPMailer/PHPMailer //下载PHPMailer并开启php_op ...