Dubbo 支持哪些调用协议?
结论先行:Dubbo 支持 dubbo、triple、rest、rmi、hessian、http、webservice、thrift、grpc 等协议,最常用的是 dubbo(私有二进制、单连接、高性能)与 triple(HTTP/2 + Protobuf、兼容 gRPC)。一个服务可以同时暴露多个协议,按场景选用。
一、主流协议对比
| 协议 | 传输 | 序列化 | 连接数 | 跨语言 | 适用场景 |
|---|---|---|---|---|---|
| dubbo | TCP 长连接 | Hessian2 等 | 单连接多路复用 | 弱 | 内部高频小报文调用 |
| triple | HTTP/2 | Protobuf | 多路复用流 | 强 | 跨语言、云原生、流式调用 |
| rest | HTTP/1.1 | JSON | 连接池 | 强 | 开放给前端/第三方 |
| hessian | HTTP | Hessian2 | 连接池 | 中 | 与老系统对接 |
| rmi | TCP | Java 原生 | 短连接 | 弱 | 遗留 JDK 系统 |
| thrift | TCP | Thrift | 单连接 | 强 | 已有 Thrift 生态 |
| grpc | HTTP/2 | Protobuf | 多路复用 | 强 | 迁移到 gRPC 体系 |
二、dubbo 协议的特征
┌──────┬──────┬────────┬───────────┬────────┬──────────┐
│ magic│ flag │ status │ requestId │ length │ body │
│ 2B │ 1B │ 1B │ 8B │ 4B │ N bytes │
└──────┴──────┴────────┴───────────┴────────┴──────────┘
magic=0xdabb 标识 Dubbo 报文,requestId 用于响应配对
特点:头部仅 16 字节;单条长连接承载全部并发请求;适合“小数据、高并发、低延迟”,不适合传大文件(默认单请求上限 8MB,超了会报 Data length too large)。
三、多协议暴露
dubbo:
protocols:
dubbo:
name: dubbo
port: 20880
tri:
name: tri
port: 20881
provider:
protocol: dubbo,tri # 两个协议同时暴露
@DubboService(protocol = {"dubbo", "tri"})
public class UserServiceImpl implements UserService { }
消费端指定用哪个协议:
@DubboReference(protocol = "tri", timeout = 2000)
private UserService userService;
四、协议选择的判断线
| 判断条件 | 选择 |
|---|---|
| 全公司 Java、内网、QPS 高 | dubbo |
| 需要被 Go/Python 调用,或要上 Service Mesh | triple |
| 要暴露给浏览器、第三方 | rest 或经网关转 HTTP |
| 已有 gRPC 客户端存量 | grpc/triple |
| 传大文件 | 不要用 RPC,走对象存储 + 传 URL |
五、多协议并存的运维成本
| 关注点 | 说明 |
|---|---|
| 端口 | 每个协议一个端口,防火墙与安全组要逐条放行 |
| 线程 | 每个协议独立端口与连接,线程池不能共用 |
| 监控 | 指标按协议维度拆分,否则延迟曲线会被混在一起 |
| 灰度 | 迁移期可双协议暴露,消费端按 protocol 逐个切换 |
双协议并存的目的是“可回滚”,切换完成、观察一个发布周期后再下线旧协议。
常见追问
- 追问:dubbo 协议为什么用单连接?连接少则握手、心跳、文件句柄都少;单连接下靠 requestId 并发,不存在 HTTP/1.1 的队头阻塞。
- 追问:单连接会不会成为瓶颈?会。单 TCP 连接的发送窗口与单核处理能力有限,超大流量可以调大
connections或按方法拆服务。 - 追问:triple 与 grpc 的关系?Triple 是 Dubbo 3 的协议,兼容 gRPC 的 HTTP/2 语义,同时保留 Dubbo 的服务治理能力,可与非 Java 客户端互通。
小结
- 内部高性能选 dubbo,跨语言与云原生选 triple,对外开放选 rest。
- 一个服务可多协议暴露,消费端按需声明,便于渐进迁移。
- dubbo 协议胜在头小、单连接多路复用,不适合大报文。
- 协议选择本质是“性能、通用性、生态”的三角取舍。