作者:Apache Dubbo社区

近日,Apache Dubbo 发布了 3.3 分支大版本 3.3.0-beta.1,相较于 3.2 系列版本,3.3.0-beta 引入了一些重量级的功能升级,按照社区规划,3.3 也将是 Dubbo3 非常重要的一个里程碑大版本,在 3.3.0 首个正式版本之后 Dubbo3 将正式进入长期稳定维护态,即标志着 Dubbo3 作为面向云原生时代的下一代微服务框架将具备规划的所有核心功能。

让我们先快速看一下 3.3.0-beta.1 版本为我们带来了哪些核心能力升级吧:

  • 全新升级的 Triple 协议, Triple 协议可同时运行在 HTTP1/2 之上,与 gRPC 保持 100% 兼容的同时,支持 cURL 和浏览器直接访问。
  • 新发布一系列 Spring Boot Starter 组件,包括  Zookeeper, Nacos, Sentinel 等,大幅降低开发过程中的依赖管理负担。
  • Rest 风格的编程注解支持(涵盖 Spring MVC、JAX-RS),借助 Dubbo 的多协议发布机制,可以轻松的将 RPC 服务发布为标准的 HTTP 端点,简化前端接入成本。
  • Dubbo AOT(GraalVM Native Image)正式发布,特定场景下启动速度提升 10 倍,内存等资源消耗降低 4 倍。
  • 升级 JDK 21 支持,增加 Project Loom 协程支持。
  • 可观测性进一步提升,进一步提升 metrics 统计指标,简化 tracing 等使用。

接下来,我们将对其中的一些重点功能进行更深入的讲解。

Spring Boot Starters

3.3.0-beta.1 版本发布的 Starter 组件,可以大幅简化 Spring Boot 用户的应用开发,以 Zookeeper 注册中心为例,新版本的开发只需要增加以下一个依赖即可。可以通过 https://start.dubbo.apache.org

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-zookeeper-spring-boot-starter</artifactId>
</dependency>

同样的,还有 dubbo-curator5-zookeeper-spring-boot-starter、 dubbo-nacos-spring-boot-starter、 dubbo-sentinel-spring-boot-starter、 dubbo-seata-spring-boot-starter 、 dubbo-observability-spring-boot-starter、 dubbo-tracing-otel-zipkin-spring-boot-starter 等。**

Dubbo AOT 静态化(GraalVM Native Image)

Dubbo AOT 是 Dubbo 3.3.0-beta 版本发布的静态化方案支持,它基于 GraalVM Native Image 实现,旨在大幅提升 Dubbo 应用的启动与运行速度。可以通过 https://start.dubbo.apache.org

Native 的可视性文件比 Jar 包方式的启动耗时降低了 12 倍+,在客户端应用,它的启动耗时降低了 11 倍+。所以在刚刚提到的 Serverless 场景上,它能提供一个非常好的启动速度。在扩容的时候能够达到秒级,甚至达到毫秒级。

Dubbo 3.3.0-beta 版本正式发布_spring

通过静态化执行文件执行后,比都为 Jar 包的情况,第一次调用的耗时降低 6 倍。这第一次调用代表的是预热的时长,以及第一次需要解析的类,包括资源的情况等等。这让我们在 Serverless 场景下能够瞬间达到性能峰值。

Dubbo 3.3.0-beta 版本正式发布_apache_02

在 Dubbo 应用的基础上,它的内存损耗也降低大概 3.5 倍。Native 静态化执行文件可以做到 60M 的内存占比,在客户端它的内存损耗也大概降低了 4 倍。

Dubbo 3.3.0-beta 版本正式发布_spring_03

Triple 协议升级

Triple 协议是 Dubbo3 设计的基于 HTTP 的 RPC 通信协议规范,它完全兼容 gRPC 协议,支持 Request-Response、Streaming 流式等通信模型,可同时运行在 HTTP/1 和 HTTP/2 之上。

你可以使用 cURL 等标准 HTTP 工具直接访问发布的 Triple 服务,大幅降低测试与前端接入成本。

curl \
 --header 'Content-Type: application/json' \
 --data '{"sentence": "Hello World"}' \
 http://localhost:8080/apache.dubbo.demo.example.v1.ExampleService/Say

Dubbo 框架提供了 Triple 协议的多种语言实现,它们可以帮助你构建浏览器、gRPC 兼容的 HTTP API 接口。Dubbo 框架同时支持 Protobuf-first 和 Interface-first 编程模式,即不绑定 IDL 的服务定义与开发模式,比如在 Dubbo Java 中,你可以选择使用 Java Interface 和 Pojo 类定义 Dubbo 服务,并将其发布为基于 Triple 协议通信的微服务。

以下是 Triple 协议的多语言实现布局,目前已经支持了浏览器端的 Dubbo-web,后端的 Java、Go、Node.js、Rust 等,未来会提供 Mobile 端以及更多后端语言实现。

Dubbo 3.3.0-beta 版本正式发布_HTTP_04

Rest 协议升级

基于 Dubbo 的多协议发布能力,rest 风格的 http 服务发布可以有非常多的应用场景,它可以让你在增加少量注解代码的情况下(当前支持 Spring MVC、JAX-RS 两套注解模式),将之前的 RPC 服务发布为标准的 rest 风格 HTTP 服务。这在很多场景将会非常有用,比如以下是一个 Dubbo 与 Spring Cloud 体系互通的用例。

我们要实现以下互通目标,让左边的 Spring 应用能够调用到右侧的 Dubbo 应用。我们可以利用 Dubbo 的多协议发布机制,为一些服务配置多协议(tcp & http)发布,让这个 Dubbo 应用同时服务 Dubbo 微服务体系和 Spring Cloud 微服务体系。

Dubbo 3.3.0-beta 版本正式发布_spring_05

为了实现这个效果,我们只需要在配置中增加多协议配置即可:

dubbo:
  protocols:
    - id: rest
      name: rest
      port: 8090
    - id: dubbo
      name: dubbo
      port: 20880

同时,@DubboService 服务注解中也配置为多协议发布。

@DubboService(protocol="rest,dubbo")
public class UserServiceImpl implements UserService {}

这样,我们就成功的将 UserService 服务以 dubbo 和 rest 两种协议发布了出去(多端口多协议的方式),dubbo 协议为 Dubbo 体系服务,rest 协议为 Spring Cloud 体系服务。

为了发布标准的 rest 风格服务,记得在接口上增加注解,在这里我们使用 Spring MVC 注解。

@RestController
@RequestMapping("/users")
public interface UserService {
    @GetMapping(value = "/list")
    List<User> getUsers();
}

可观测性(Metrics & Tracing)

首先,是大幅提升了 Metrics、Tracing 的易用性,对于 Spring Boot 用户而言,只需要添加一个依赖即可。

开启 Metrics:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-observability-spring-boot-starter</artifactId>
</dependency>

开启 Tracing:

<dependency>
    <groupId>org.apache.dubbo</groupId>
    <artifactId>dubbo-tracing-otel-zipkin-spring-boot-starter</artifactId>
</dependency>

其次,在监控指标的丰富度上进一步提升。

Dubbo 3.3.0-beta 版本正式发布_spring_06

JDK 21 与协程

3.3.0-beta 版本可支持平滑升级到 JDK 21 版本,同时,增加了 Project Loom 协程支持,只需要配置 setThreadPool(virtual) 即可实现协程模型开启。

具体实现上,是我们在新版本增加了以下 Threadpool SPI 实现:

virtual=org.apache.dubbo.common.threadpool.support.loom.VirtualThreadPool
/**
 * Creates a thread pool that use virtual thread
 *
 * @see Executors#newVirtualThreadPerTaskExecutor()
 */
public class VirtualThreadPool implements ThreadPool {
    @Override
    public Executor getExecutor(URL url) {
        String name = url.getParameter(THREAD_NAME_KEY, (String) url.getAttribute(THREAD_NAME_KEY, DEFAULT_THREAD_NAME));
        return Executors.newThreadPerTaskExecutor(
            Thread.ofVirtual()
                .name(name, 1)
                .factory());
    }
}

Roadmap

对于 Dubbo3 而言,当前社区维护有 3.1、3.2、3.3 三个大的版本,其中 3.2 是当前推荐的稳定生产版本,3.3 正处于 beta 阶段,在接下来几个月将取代 3.2 成为最新稳定版本。

截止 3.3.0-beta.1 版本,整个 Dubbo3 规划的核心功能均已开发完成。从这个版本开始,Dubbo3 将进入长期稳定维护阶段,这意味着我们将不会再为任何的 Dubbo3 新版本引入新的功能规划,社区将专注在已有功能的迭代与稳定性保证上。基于这样的基调,我们制定未来半年的社区 Roadmap:https://github.com/apache/dubbo/issues/13065

关于面向未来的新功能,我们将在 Dubbo4 中持续探索,欢迎持续关注社区进展。