文档
前言
RPC(Remote Procedure Call)是微服务通信的基石。与 REST HTTP 不同,RPC 让你像调用本地方法一样调用远程服务。Dubbo 是 Java 生态中最成熟的 RPC 框架,承载着双十一、12306 等超大规模流量。
第一章:Dubbo 架构总览
1.1 核心角色
┌──────────┐ 注册/订阅 ┌──────────────┐
│ Provider │◄──────────→│ Registry │
└────┬─────┘ │ (Nacos/ZK) │
│ └──────┬────────┘
│ RPC 调用 │ 发现地址
▼ ▼
┌──────────┐ ┌──────────┐
│ Consumer │──RPC 调用──→│ Provider │
└──────────┘ └──────────┘
Monitor ←─── 统计信息(异步上报)
1.2 调用链路
Consumer 调用 GreetingService.sayHello("Alice")
→ 1. 从 Registry 获取 Provider 地址列表
→ 2. LoadBalance 选择一台 Provider
→ 3. 序列化请求参数(Hessian2 / Protobuf)
→ 4. 通过 Netty 发送二进制数据
→ 5. Provider 反序列化 → 执行 → 序列化结果返回
→ 6. Consumer 收到响应 → 反序列化 → 返回给调用方
第二章:Dubbo 3 新特性
2.1 Triple 协议(HTTP/2 + Protobuf)
Dubbo 2 时代:
协议: dubbo://(私有协议,非标准)
序列化: Hessian2
穿透网关: 需要协议转换
Dubbo 3 时代:
协议: tri://(基于 HTTP/2,兼容 gRPC)
序列化: Protobuf(推荐)/ JSON
穿透网关: 原生 HTTP/2,Envoy/网关直接转发
2.2 应用级服务发现
Dubbo 2: 接口级注册(N 个接口注册 N 条)
/dubbo/com.example.GreetingService/providers
/dubbo/com.example.OrderService/providers
/dubbo/com.example.PaymentService/providers
Dubbo 3: 应用级注册(一个应用注册 1 条)
/dubbo/demo-provider/instances
→ 大幅减轻注册中心压力
2.3 流量路由与灰度发布
# 标签路由:将流量路由到特定实例
dubbo:
provider:
tag: v2 # 只接收 tag=v2 的流量
// 消费者指定路由标签
RpcContext.getClientAttachment().setAttachment("dubbo.tag", "v2");
2.4 自适应负载均衡
Dubbo 3.2+ 引入 P2C(Pick Two Choose One)算法,根据实例实际负载动态选择,而非简单的轮询/随机。
第三章:Dubbo 协议对比
| 协议 | 传输层 | 序列化 | 适用场景 | 性能 |
|---|---|---|---|---|
| dubbo:// | TCP (Netty) | Hessian2 | 内部 RPC(默认) | ⭐⭐⭐⭐ |
| tri:// | HTTP/2 | Protobuf | 跨语言/网关 | ⭐⭐⭐⭐⭐ |
| rest:// | HTTP | JSON | 对外开放 API | ⭐⭐⭐ |
| grpc:// | HTTP/2 | Protobuf | gRPC 生态 | ⭐⭐⭐⭐⭐ |
| redis:// | TCP | JSON | 轻量级 | ⭐⭐ |
第四章:Dubbo vs Spring Cloud vs gRPC
| 维度 | Dubbo | Spring Cloud (Feign) | gRPC |
|---|---|---|---|
| 通信协议 | TCP 二进制 | HTTP/1.1 + JSON | HTTP/2 + Protobuf |
| 性能 | 高 | 中 | 高 |
| 跨语言 | 中等(Go/Rust) | 天然 HTTP | 原生 |
| 服务治理 | ✅ 强大 | ✅ 中等 | ❌ 需额外组件 |
| 网关友好 | Tri 协议 ✅ | ✅ | ✅ |
| Spring 集成 | ✅ 原生 | ✅ 原生 | ✅ spring-grpc |
| 学习曲线 | 中 | 低 | 中高 |
| 国内生态 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
第五章:性能调优要点
5.1 线程模型
dubbo:
protocol:
name: dubbo
# I/O 线程池
iothreads: 4
# 业务线程池(默认 200)
threads: 200
5.2 序列化选择
# 高性能场景:Protobuf
dubbo:
provider:
serialization: protobuf
# 兼容性优先:Hessian2(默认)
dubbo:
provider:
serialization: hessian2
5.3 连接管理
dubbo:
consumer:
connections: 1 # 对每个 Provider 的连接数
actives: 0 # 并发限制(0=不限制)
actives: 100 # 每服务每消费者最大并发
思考题
- Dubbo 3 为什么要从接口级注册改为应用级注册?解决了什么问题?
- Triple 协议为什么要基于 HTTP/2?相比 dubbo 协议的 TCP 长连接有什么优势和劣势?
- 在 Dubbo 中,超时(timeout)和重试(retries)应该怎么配合设置?设置不当会引发什么"雪崩"?
- Dubbo 的 Mock 功能(本地伪装)能解决什么问题?它在生产环境中有哪些实际用途?
下一步
- 学习 Dubbo + Sentinel 实现限流熔断
- 学习 Dubbo + Seata 实现分布式事务
- 学习 Dubbo Mesh(Proxyless Service Mesh)