Skip to content

Dubbo 学习笔记(Dubbo3)

Dubbo 入门

Dubbo 是什么?

Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力, 利用 Dubbo 提供的丰富服务治理特性,可以实现诸如服务发现、负载均衡、流量调度等服务治理诉求。Dubbo 被设计为高度可扩展,用户可以方便的实现流量拦截、选址的各种定制逻辑。

Dubbo 的历史和发展

Dubbo 最初是为了解决阿里内部的微服务架构问题而设计并开发的。 2008 年,阿里就将 Dubbo 开源。 2017 年,Dubbo 被正式捐献 Apache 软件基金会并成为 Apache 顶级项目。阿里将其内部 HSF 系统与开源社区 Dubbo 相融合,与社区一同推出 Dubbo3 。

Dubbo 的核心特性与优势

优势

  1. 多语言

    Dubbo 提供几乎所有主流语言的 SDK 实现,定义了一套统一的微服务开发范式。

  2. 任意通信协议

    Dubbo 微服务间远程通信实现细节,支持 HTTP、HTTP/2、gRPC、TCP 等所有主流通信协议

  3. 高性能数据传输

    Dubbo 内置支持 Dubbo2、Triple 两款高性能通信协议。

    • Dubbo2 是基于 TCP 传输协议之上构建的二进制私有 RPC 通信协议,是一款非常简单、紧凑、高效的通信协议。
    • Triple 是基于 HTTP/2 的新一代 RPC 通信协议,在网关穿透性、通用性以及 Streaming 通信上具备优势,Triple 完全兼容 gRPC 协议
  4. 全新服务发现模型

    Dubbo 3 引入了应用级服务发现模型,取代了 Dubbo 2.x 中的接口级服务发现模型。这种改变显著降低了注册中心的存储压力和内存占用,支持超大规模集群的服务治理。

  5. 流量管控

    在地址发现和负载均衡机制之外,Dubbo 丰富的流量管控规则可以控制服务间的流量走向和 API 调用,基于这些规则可以实现在运行期动态的调整服务行为如超时时间、重试次数、限流参数等,通过控制流量分布可以实现 A/B 测试、金丝雀发布、多版本按比例流量分配、条件匹配路由、黑白名单等,提高系统稳定性。

  6. 云原生适配

    Dubbo 3 深度整合了 Kubernetes 等基础设施,实现了与 Service Mesh 架构的良好对接。通过 Sidecar 模式或 Proxyless 模式,Dubbo 服务可以无缝集成到现有的云原生环境中。

  7. 微服务生态

    围绕 Dubbo 我们构建了完善的微服务治理生态,对于绝大多数服务治理需求,通过简单几行配置即可开启。对于官方尚未适配的组件或者用户内部系统,也可以通过 Dubbo 扩展机制轻松适配。

    governance

技术架构

架构上分为两层:服务治理抽象控制面 和 Dubbo 数据面 。

  • 服务治理控制面

    服务治理控制面不是特指如注册中心类的单个具体组件,而是对 Dubbo 治理体系的抽象表达。控制面包含协调服务发现的注册中心、流量管控策略、Dubbo Admin 控制台等,如果采用了 Service Mesh 架构则还包含 Istio 等服务网格控制面。

  • Dubbo 数据面

    。数据面代表集群部署的所有 Dubbo 进程,进程之间通过 RPC 协议实现数据交换,Dubbo 定义了微服务应用开发与调用规范并负责完成数据传输的编解码工作。

    • 服务消费者 (Dubbo Consumer),发起业务调用或 RPC 通信的 Dubbo 进程
    • 服务提供者 (Dubbo Provider),接收业务调用或 RPC 通信的 Dubbo 进程

architecture

数据面

  • Dubbo 作为 服务开发框架 约束了微服务定义、开发与调用的规范,定义了服务治理流程及适配模式

  • Dubbo 作为 RPC 通信协议实现 解决服务间数据传输的编解码问题

服务开发框架

Dubbo 在微服务应用开发框架之上抽象了一套 RPC 服务定义、暴露、调用与治理的编程范式,比如 Dubbo Java 作为服务开发框架,当运行在 Spring 体系时就是构建在 Spring Boot 应用开发框架之上的微服务开发框架,并在此之上抽象了一套 RPC 服务定义、暴露、调用与治理的编程范式。

具体内容如下:

  • RPC 服务定义、开发范式。比如 Dubbo 支持通过 IDL 定义服务,也支持编程语言特有的服务开发定义方式,如通过 Java Interface 定义服务。
  • RPC 服务发布与调用 API。Dubbo 支持同步、异步、Reactive Streaming 等服务调用编程模式,还支持请求上下文 API、设置超时时间等。
  • 服务治理策略、流程与适配方式等。作为服务框架数据面,Dubbo 定义了服务地址发现、负载均衡策略、基于规则的流量路由、Metrics 指标采集等服务治理抽象,并适配到特定的产品实现。

framework

首次尝试(HelloWord)

  • JDK 版本需要 17+

    AmazonJDK17

  • 下载并配置 Nacos 作为注册中心

    Nacos 下载

    Windows10 本地启动单机版 nacos

  • 第一个 Dubbo 项目

    可以下载官网的快速启动示例

    bash
    curl -O -# https://dubbo-demo.oss-cn-hangzhou.aliyuncs.com/quickstart/dubbo-quickstart.zip
    unzip dubbo-quickstart

    下载后安装依赖,启动!

    image-20250813171805284

可以在控制台中测试

bash
Invoke-WebRequest `
    -Uri "http://localhost:50051/org.apache.dubbo.samples.quickstart.dubbo.api.DemoService/sayHello/" `
    -Method Post `
     -Headers @{"Content-Type" = "application/json"} `
     -Body '[ "Dubbo" ]'

通了

image-20250813171951530

在服务中加个 HelloWord

image-20250813172219491

实现一下:

image-20250813172251357

重新启动后调用试试

bash
 Invoke-WebRequest `
     -Uri "http://localhost:50051/org.apache.dubbo.samples.quickstart.dubbo.api.DemoService/helloWord/" `
    -Method Post `
    -Headers @{"Content-Type" = "application/json"} `
    -Body '[ "Dubbo" ]'

image-20250813172348792

成功 HellowWord,可以在简历上写精通 Dubbo 了 🤣

项目搭建

Pom.xml 依赖

xml
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <dubbo.version>3.3.0</dubbo.version>
        <spring-boot.version>3.5.0</spring-boot.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-nacos-spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

ymal 配置

yml
dubbo:
  application:
    name: dubbo-test-demo
    logger: slf4j
  protocol:
    name: tri
    port: -1
  registry:
    address: nacos://${nacos.address:127.0.0.1}:8848?username=nacos&password=nacos
    register-mode: instance

在启动类上添加启用注解@EnableDubbo

java
@SpringBootApplication
@EnableDubbo
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

创建服务类并实现,实现类上添加注解@DubboService让服务能够被扫描到

java
@DubboService
public class TestServiceImpl implements TestService {
    @Override
    public String test() {
        return "TestServiceImpl test()";
    }
}

启动后进 Nacos 控制台

image-20250813181042580

curl 测试:

image-20250813181116404

通信协议

Dubbo 支持如,HTTP/2、REST、gRPC、JsonRPC、Thrift、Hessian2 等几乎所有主流的通信协议。 这样的 Protocol 设计模式给构建微服务带来了最大的灵活性,开发者可以根据需要如性能、通用型等选择不同的通信协议,不再需要任何的代理来实现协议转换,甚至可以通过 Dubbo 实现不同协议间的迁移。

protocol

协议对比

协议性能网关友好流式通信多语言支持编程 API说明
triple支持,客户端流、服务端流、双向流支持(Java、Go、Node.js、JavaScript、Rust)Java Interface、Protobuf(IDL)在多语言兼容、性能、网关、Streaming、gRPC 等方面最均衡的协议实现,官方推荐。
dubbo不支持支持(Java、Go)Java Interface性能最高的私有协议,但前端流量接入、多语言支持等成本较高
rest不支持支持Java Interfacerest 协议在前端接入、互通等方面具备最高的灵活性,但对比 rpc 存在性能、弱类型等缺点。注意,rest 在 dubbo3 中仅是 triple 协议的一种发布形式

Triple 协议

基本配置

默认端口为 50051,如果设置 port: -1 则会随机选取端口(从 50051 自增,直到找到第一个可用端口)。

yml
dubbo:
  protocol:
    name: tri
    port: 50051

服务定义方式

Java Interface Protobuf(IDL)

Dubbo 协议

基本配置

默认端口为 20880,如果设置 port: -1 则会随机选取端口(从 20880 自增,直到找到第一个可用端口)。

yaml
dubbo:
  protocol:
    name: dubbo
    port: 20880

服务定义方式

Java Interface

REST 协议

自 3.3 版本开始 triple 协议支持以 rest 风格发布标准的 http 服务,因此,如果发布 rest 风格的服务等同于使用 triple 协议,只不过,我们要在服务定义上加入特定的注解(Spring Web、JAX-RS)。

yaml
dubbo:
  protocol:
    name: tri
    port: 50051

服务定义方式

Java Interface

java
@RestController
@RequestMapping("/demo")
public interface DemoService {
    @GetMapping(value = "/hello")
    String sayHello();
}

多协议发布

多端口多协议

多协议发布是指为同一个服务同时提供多种协议访问方式,多协议可以是任意两个或多个协议的组合。(默认情况下框架会自动选择 dubbo 协议调用)

可以使用注解@DubboReference(protocol="tri"),或者在 application.yml 配置文件中指定全局默认值:

yml
dubbo:
  consumer:
    protocol: tri

配置

yml
dubbo:
 protocols:
   tri:
     name: tri
     port: 50051
   dubbo:
     name: dubbo
	 port: 20880
  1. 提供者实例同时监听两个端口 20880 和 50051
  2. 同一个实例,会在注册中心注册两条地址 url
  3. 不同的消费端可以选择以不同协议调用同一个提供者发布的服务

高级功能

  1. 负载均衡策略
    • 常见的负载均衡算法(随机、轮询、最少活跃数等)
    • 自定义负载均衡规则
  2. 集群容错机制
    • 失败重试、快速失败等策略
    • 高可用部署方案
  3. 动态配置管理
    • 动态调整权重
    • 条件路由规则配置

监控与运维

  1. 监控中心搭建
    • 安装并配置 Dubbo Admin 控制台
    • 查看服务调用情况
  2. 日志分析与性能调优
    • 日志级别设置
    • 性能瓶颈定位与优化

实战案例

  1. 构建微服务应用

    • 设计微服务架构
    • 开发具体的服务模块
  2. 测试与部署

    • 单元测试编写
    • 持续集成/持续部署(CI/CD)流程设置
最近更新