Dubbo 支持哪些调用协议?

#中间件#面试八股

Dubbo 支持哪些调用协议?

结论先行:Dubbo 支持 dubbo、triple、rest、rmi、hessian、http、webservice、thrift、grpc 等协议,最常用的是 dubbo(私有二进制、单连接、高性能)与 triple(HTTP/2 + Protobuf、兼容 gRPC)。一个服务可以同时暴露多个协议,按场景选用。

一、主流协议对比

协议传输序列化连接数跨语言适用场景
dubboTCP 长连接Hessian2 等单连接多路复用弱内部高频小报文调用
tripleHTTP/2Protobuf多路复用流强跨语言、云原生、流式调用
restHTTP/1.1JSON连接池强开放给前端/第三方
hessianHTTPHessian2连接池中与老系统对接
rmiTCPJava 原生短连接弱遗留 JDK 系统
thriftTCPThrift单连接强已有 Thrift 生态
grpcHTTP/2Protobuf多路复用强迁移到 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 Meshtriple
要暴露给浏览器、第三方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 协议胜在头小、单连接多路复用,不适合大报文。
  • 协议选择本质是“性能、通用性、生态”的三角取舍。
笔记加载中…