Loading...

文章背景图

Dubbo:超详细部署与使用教程

2026-10-27
0
- 字
- 分钟
|

Dubbo:超详细部署与使用教程

Apache Dubbo 是一款高性能、易使用的 Java RPC 与微服务框架,提供通信、服务发现、流量管理、可观测、安全、工具链等企业级微服务建设能力,支持 Triple(gRPC 兼容)、Dubbo2(TCP)、REST 等多种协议,并提供 Java、Go、Python、PHP、Rust、Node.js 等多语言实现。

所属公司 GitHub 仓库 官方文档/官网 开源协议 Star 数 最新版本(截至 2026-10-27) 主要语言
Apache 软件基金会(起源于阿里巴巴) github.com/apache/dubbo 官网:dubbo.apache.org(中文文档:cn.dubbo.apache.org) Apache-2.0 约 42k dubbo-3.2.20 Java

目录


一、项目概述

1.1 项目定位

Apache Dubbo 最初由阿里巴巴开源,现为 Apache 顶级项目。它解决的核心问题是:在分布式系统中,服务提供方(Provider)与服务消费方(Consumer)之间如何高效、稳定地进行远程调用,以及如何动态发现彼此的地址。Dubbo 在阿里双11 等大规模场景中经历了多年生产验证,是国内使用最广泛的 Java RPC 框架之一。

Dubbo 3.x 在 Dubbo 2.x 的基础上,主推面向云原生的 Triple 协议(基于 HTTP/2、与 gRPC 兼容),并完善了服务治理、可观测(Metrics/Tracing)、应用级服务发现、Kubernetes / Service Mesh 集成等能力。

1.2 核心功能

  • 高性能 RPC 调用:支持 Triple(gRPC 兼容,HTTP/2)、Dubbo2(自定义 TCP 协议)、REST 等多种协议,可扩展自定义协议。
  • 服务自动注册与发现:Provider 启动时把地址注册到注册中心,Consumer 动态拉取 Provider 列表并做负载均衡;支持 Zookeeper、Nacos、Redis、Multicast 等注册中心。
  • 负载均衡与流量管理:内置随机、轮询、一致性哈希等负载策略;支持分组、版本、标签路由、金丝雀发布、流量治理。
  • 可观测性:内置 Metrics(Prometheus)、Tracing(链路追踪)、访问日志。
  • 容错机制:失败重试、快速失败、并行调用、合并请求等集群容错策略。
  • 可视化控制台(dubbo-admin):服务查询、治理规则、元数据管理的 Web 控制台。
  • 多语言:Java 之外,官方生态提供 Go(dubbo-go)、Python、PHP、Rust、Node.js/Web 等实现。
  • 云原生支持:应用级服务发现、Protobuf 序列化、Kubernetes 部署、与 Service Mesh 集成。

1.3 技术架构

官方架构图如下:Consumer 与 Provider 之间通过 RPC 协议(Triple / TCP / REST)直接通信;双方都向注册中心(如 Zookeeper、Nacos)注册与订阅,Consumer 从注册中心动态发现 Provider 实例并按策略管理流量;内置动态配置、指标、链路追踪、安全与可视化控制台能力。

Dubbo 官方架构图(Consumer / Provider / 注册中心)


二、环境要求

项目 要求
JDK JDK 8 及以上(3.2.x 官方支持 JDK 1.8–17;3.3.x 官方支持 JDK 1.8–21,并规划 JDK 25,以官方版本表为准)
构建工具 Maven 3.6+ / Gradle
操作系统 Linux / macOS / Windows 均可
注册中心 Zookeeper(默认演示)或 Nacos;生产建议集群部署
核心端口 Dubbo 服务端口默认 20880(dubbo.protocol.port);Zookeeper 默认 2181;Nacos 默认 8848
内存 Provider/Consumer 工程本身几百 MB 即可;Zookeeper 1GB+

注意:Dubbo 是一个框架(SDK),它本身不是一个独立的「服务器进程」,而是作为依赖嵌入你的 Spring Boot 工程;真正需要独立部署的是注册中心(Zookeeper/Nacos)和可选的 dubbo-admin 控制台。


三、部署方式

下面给出完整可复现路径:准备注册中心(Zookeeper)→ 搭建 Provider 工程 → 搭建 Consumer 工程 → 启动验证;另附 Nacos 注册中心、dubbo-admin 控制台、源码编译。

3.1 方式一:Zookeeper 注册中心 + Provider/Consumer(最经典)

步骤 1:启动 Zookeeper 注册中心

本地开发用 Docker 一键起 Zookeeper:

docker run -d --name zookeeper -p 2181:2181 zookeeper:3.8

或下载官方 Zookeeper 发行包本地启动:

# 解压后
zkServer.sh start

确认 2181 端口在监听:

ss -lntp | grep 2181

步骤 2:新建 Maven 工程(父 POM)

pom.xml(注意 Dubbo 版本取最新 release 3.2.20,以实际 Maven Central 为准):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>dubbo-demo</artifactId>
    <version>1.0.0</version>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/>
    </parent>

    <properties>
        <java.version>17</java.version>
        <dubbo.version>3.2.20</dubbo.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-bom</artifactId>
                <version>${dubbo.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

步骤 3:定义公共接口

新建模块 api,只放接口(Provider 与 Consumer 都依赖它):

package com.example.demo.api;

public interface GreetingService {
    String sayHello(String name);
}

步骤 4:Provider 服务提供方

provider/pom.xml 引入依赖:

<dependencies>
    <!-- 公共接口 -->
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>api</artifactId>
        <version>1.0.0</version>
    </dependency>

    <!-- Dubbo Spring Boot Starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
    </dependency>

    <!-- Zookeeper 注册中心客户端(curator) -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-dependencies-zookeeper</artifactId>
        <type>pom</type>
    </dependency>
</dependencies>

实现服务,用 @DubboService 暴露:

package com.example.demo.provider;

import com.example.demo.api.GreetingService;
import org.apache.dubbo.config.annotation.DubboService;

@DubboService
public class GreetingServiceImpl implements GreetingService {
    @Override
    public String sayHello(String name) {
        return "Hello, " + name + "! (from Dubbo Provider)";
    }
}

启动类:

package com.example.demo.provider;

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

application.yml:

dubbo:
  application:
    name: dubbo-demo-provider
  protocol:
    name: dubbo        # 使用 Dubbo2 TCP 协议;也可改为 triple
    port: 20880        # 暴露服务端口,默认 20880
  registry:
    address: zookeeper://127.0.0.1:2181   # 注册中心地址
  scan:
    base-packages: com.example.demo.provider

步骤 5:Consumer 服务消费方

consumer/pom.xml 同样引入 dubbo-spring-boot-starter 与 dubbo-dependencies-zookeeper,并依赖 api。

用 @DubboReference 远程引用:

package com.example.demo.consumer;

import com.example.demo.api.GreetingService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component;

@Component
public class GreetingConsumer {

    @DubboReference
    private GreetingService greetingService;

    public String hello(String name) {
        return greetingService.sayHello(name);
    }
}

Consumer 启动类同样加 @EnableDubbo,application.yml:

dubbo:
  application:
    name: dubbo-demo-consumer
  protocol:
    name: dubbo
    port: -1            # Consumer 不需要暴露端口,-1 表示随机端口
  registry:
    address: zookeeper://127.0.0.1:2181

步骤 6:启动并验证

# 终端 1:先起 Zookeeper
docker start zookeeper

# 终端 2:起 Provider
cd provider && mvn spring-boot:run

# 终端 3:起 Consumer
cd consumer && mvn spring-boot:run

Provider 启动日志中出现类似内容即注册成功:

DUBBO Service: com.example.demo.api.GreetingService has been registered in registry
 dubbo service port: 20880

写一个 Controller 或在测试中调用 greetingConsumer.hello("Dubbo"),返回:

Hello, Dubbo! (from Dubbo Provider)

即说明 Consumer 通过注册中心发现了 Provider 并完成了一次远程 RPC 调用。

3.2 方式二:Nacos 注册中心

如果已部署 Nacos(参考同目录《Nacos.md》),只需把 registry.address 换成 Nacos:

dubbo:
  application:
    name: dubbo-demo-provider
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: nacos://127.0.0.1:8848     # 使用 Nacos 作为注册中心

Dubbo 3.x 官方支持 Nacos 作为注册中心(包括应用级服务发现),依赖同上,无需额外 jar(Nacos 注册中心适配已内置)。

3.3 方式三:Triple 协议(gRPC 兼容,云原生推荐)

把协议改为 triple 即可使用 Triple(基于 HTTP/2):

dubbo:
  protocol:
    name: triple
    port: 50051

Triple 协议兼容 gRPC,可用标准 gRPC 客户端或 curl 直接访问,适合云原生与跨语言场景。具体 IDL 与示例以官方 Triple 文档为准。

3.4 方式四:dubbo-admin 可视化控制台

# 官方控制台仓库:github.com/apache/dubbo-admin
# 方式一:Docker 运行(需连到你的注册中心)
docker run -d --name dubbo-admin -p 8080:8080 \
  -e dubbo.registry.address=zookeeper://127.0.0.1:2181 \
  apache/dubbo-admin:latest

浏览器访问 http://127.0.0.1:8080(默认账号密码以官方 README 为准),可查看服务列表、提供者/消费者、治理规则。

3.5 方式五:源码编译

git clone https://github.com/apache/dubbo.git
cd dubbo
# 切换到稳定分支(如 3.2.x)
mvn -Dmaven.test.skip=true clean install

编译产物为各模块 jar,安装到本地 Maven 仓库后即可在工程中引用。

3.6 验证部署成功(通用)

  1. Provider 启动日志打印服务已注册到注册中心、端口 20880 监听;
  2. 在 Zookeeper 节点上能看到 dubbo/com.example.demo.api.GreetingService 临时节点;
  3. Consumer 启动后无注册异常,调用返回 Provider 的结果;
  4. dubbo-admin 控制台能看到该服务的 Provider/Consumer 实例。

四、使用方法

4.1 基础用法

最小化模型就是三步:定义接口 → Provider 用 @DubboService 暴露 → Consumer 用 @DubboReference 注入。接口必须两边一致(建议抽成独立 api 模块共享)。

4.2 常用配置与 API

多版本/分组(灰度发布基础)

// Provider
@DubboService(version = "v1", group = "cn")
public class GreetingServiceImplV1 implements GreetingService { ... }

// Consumer
@DubboReference(version = "v1", group = "cn")
private GreetingService greetingService;

超时与重试

dubbo:
  provider:
    timeout: 3000        # 毫秒
    retries: 2

或在引用上单独设置:

@DubboReference(timeout = 5000, retries = 0)
private GreetingService greetingService;

负载均衡策略

@DubboService(loadbalance = "random")      // random / roundrobin / leastactive / consistenthash
public class GreetingServiceImpl implements GreetingService { ... }

启动时检查(避免强依赖启动失败)

dubbo:
  consumer:
    check: false        # Consumer 启动时不检查 Provider 是否可用

4.3 进阶功能

  • 应用级服务发现:Dubbo 3.x 支持应用粒度注册(区别于接口粒度),与 Kubernetes 亲和,可降低注册中心数据量。
  • 链路追踪与 Metrics:引入 micrometer/prometheus 依赖后,Dubbo 自动暴露 RPC 指标;配合 Sleuth/OpenTelemetry 做全链路追踪。
  • 泛化调用(Generic Service):Consumer 不依赖接口 jar,用 GenericService 直接调用任意服务,适合网关/测试平台。
  • 异步调用与响应式:Triple 协议支持流式(streaming)调用,Dubbo 3.3 支持 Mutiny 响应式(以官方文档为准)。
  • Kubernetes / Mesh:Dubbo 3 可与 Service Mesh 协作,或直跑在 K8s 上。

4.4 适用场景

  • 多个 Java 服务之间需要高性能内部 RPC;
  • 已有大量接口需要统一注册发现与治理;
  • 跨语言(Java/Go/Node)服务互通(选 Triple/gRPC);
  • 微服务从 Spring Cloud 或其他框架迁移,需要 RPC 维度的流量治理;
  • 大规模集群下需要负载均衡、灰度、容错、可观测。

五、常见问题排查(FAQ)

Q1:Consumer 启动报 No such provider: ...GreetingService 或 Failed to check the service' status - 原因:Provider 未启动、未注册到同一注册中心、或 Consumer 的 check 默认为 true 而 Provider 还没起来。 - 解决:确认 Provider 已注册成功;两边注册中心 address 一致;临时设置 dubbo.consumer.check=false。

Q2:注册中心连不上,报 KeeperErrorCode / 连接超时 - 原因:Zookeeper 未启动或 2181 未放行。 - 解决:docker ps 确认 ZK 在跑;telnet 127.0.0.1 2181;防火墙/安全组放行。

Q3:接口能注入但调用报序列化错误 / ClassCastException - 原因:Provider 与 Consumer 的接口类版本不一致,或 POJO 未实现 Serializable。 - 解决:抽独立 api 模块两边共用同一版本;实体类实现 Serializable。

Q4:端口冲突 BindAddressException: 20880 - 原因:本机已有进程占用 20880。 - 解决:改 dubbo.protocol.port,或设为 -1 自动分配。

Q5:调用超时 / 偶发失败 - 原因:默认 timeout 较短、Provider 处理慢、重试放大流量。 - 解决:合理设置 timeout;读 Provider 慢日志定位;对写操作 retries=0 避免重复执行。

Q6:Triple 协议用 curl 访问失败 - 原因:Triple 基于 HTTP/2,普通 HTTP/1.1 工具需特殊方式。 - 解决:按官方 Triple 文档用 gRPC 客户端或开启 HTTP/2 cleartext 访问。

Q7:JDK 17 下反射报错 module cannot access - 原因:Dubbo 依赖的部分库在 JDK17 强封装下受限。 - 解决:用 Dubbo 3.2.x 及以上,并按官方提示加 JVM 参数(如 --add-opens)。

Q8:服务注册了但 Consumer 拉不到最新实例 - 原因:注册中心会话未更新、或 Consumer 缓存。 - 解决:重启 Consumer;确认注册中心与 Consumer 网络互通;检查 dubbo-admin 里实例是否在线。


六、部署注意事项与最佳实践

  1. 注册中心必须高可用:生产 Zookeeper 至少 3 节点集群,或直接用 Nacos 集群;不要用单点 ZK 承载核心链路。
  2. 接口与实体隔离:把 API 与 DTO 单独成模块,避免 Provider/Consumer 互相依赖实现。
  3. 合理设置超时与重试:读操作可重试,写操作 retries=0,防止重复下单类问题。
  4. 端口规划:每台机器的 Provider 实例数量决定 20880 端口占用,多实例时用 -1 自动分配。
  5. 可观测先行:生产打开访问日志、接入 Prometheus Metrics 与链路追踪,否则 RPC 黑盒难排查。
  6. 版本与分组治理:灰度发布用 version/group 隔离,不要靠多部署一套。
  7. 鉴权与网络隔离:Dubbo 端口不要暴露到公网,注册中心与 Provider 之间走内网。
  8. JDK 与框架版本匹配:JDK 17 用 3.2+;新版本框架优先选官方 actively maintained 的分支。

七、参考资料

  • GitHub 仓库:https://github.com/apache/dubbo
  • 官网首页:https://dubbo.apache.org/zh-cn/
  • 中文文档:https://cn.dubbo.apache.org/zh-cn/
  • 5 分钟轻量级 RPC:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/framework/lightweight-rpc/
  • Spring Boot 接入:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/tasks/develop/springboot/
  • 协议(Triple):https://dubbo.apache.org/zh-cn/overview/reference/protocols/triple/
  • 部署:https://dubbo.apache.org/zh-cn/overview/tasks/deploy/
  • 服务发现:https://dubbo.apache.org/zh-cn/overview/core-features/service-discovery/
  • 可观测:https://dubbo.apache.org/zh-cn/overview/tasks/observability/
  • dubbo-admin 控制台:https://github.com/apache/dubbo-admin
  • Release 下载:https://github.com/apache/dubbo/releases
评论交流

文章目录