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 实例并按策略管理流量;内置动态配置、指标、链路追踪、安全与可视化控制台能力。

二、环境要求
| 项目 | 要求 |
|---|---|
| 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 验证部署成功(通用)
- Provider 启动日志打印服务已注册到注册中心、端口 20880 监听;
- 在 Zookeeper 节点上能看到
dubbo/com.example.demo.api.GreetingService临时节点; - Consumer 启动后无注册异常,调用返回 Provider 的结果;
- 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 里实例是否在线。
六、部署注意事项与最佳实践
- 注册中心必须高可用:生产 Zookeeper 至少 3 节点集群,或直接用 Nacos 集群;不要用单点 ZK 承载核心链路。
- 接口与实体隔离:把 API 与 DTO 单独成模块,避免 Provider/Consumer 互相依赖实现。
- 合理设置超时与重试:读操作可重试,写操作
retries=0,防止重复下单类问题。 - 端口规划:每台机器的 Provider 实例数量决定 20880 端口占用,多实例时用
-1自动分配。 - 可观测先行:生产打开访问日志、接入 Prometheus Metrics 与链路追踪,否则 RPC 黑盒难排查。
- 版本与分组治理:灰度发布用
version/group隔离,不要靠多部署一套。 - 鉴权与网络隔离:Dubbo 端口不要暴露到公网,注册中心与 Provider 之间走内网。
- 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