Skip to content
Charles Shao
Go back

Dubbo 深挖 · 协议栈与 Triple / 序列化

views

Cluster 决定打谁、失败怎么办;真正把 Invocation 变成字节、在连接上多路复用并还原成对象的,是 Protocol + Serialization + Transport。这一层选错,表现是 CPU 打满、包体膨胀、跨语言互通失败,或「明明通了却对不上字段」。

本篇对比经典 Dubbo 协议Triple,讲清序列化选型,并落到广告热路径上的性能与兼容纪律。

本文是 Dubbo 深挖系列的第 4 篇。架构开篇 → ② 注册发现 → ③ Cluster → ④ 协议与 Triple(本篇) → ⑤ 流量治理

一句话定位:协议决定帧与多路复用,序列化决定 CPU 与兼容;Triple 用 HTTP/2 把 Dubbo 推进云原生与 gRPC 互通,但不自动让你的接口变成跨语言友好。

TL;DR

Table of contents

Open Table of contents

1. 协议在栈里的位置

回顾开篇分层:Proxy / Cluster 之下是 Protocol。Protocol 的职责包括:

  1. export / refer:把服务暴露为可调用的 Invoker,或引用远端;
  2. 编解码Invocation ↔ 字节帧;
  3. 与 Transport 协作:连接管理、心跳、线程派发。

传输层细节与 Netty 编解码连接与 I/O 模型 同族——粘包拆包、空闲踢除、背压,都会从这一层冒出来。

2. 经典 Dubbo 协议

经典 Dubbo 协议帧示意。消息头含魔数、标志位、序列化类型、请求 ID、数据长度;消息体为序列化后的 Invocation/Result。下方标注:请求响应靠 requestId 关联,可在单连接上并发多个调用。

要点:

它为 Java 微服务优化得很深,但跨语言、被网关/Mesh 识别、与 gRPC 生态互通不是它的主场——这正是 Triple 的切入点。

3. Triple:为什么要 HTTP/2

Triple 与 gRPC 互通示意。左侧 Dubbo Consumer(Triple)经 HTTP/2 调用右侧 Dubbo Provider 或 gRPC Server;中间标注 Protobuf payload、Header 元数据、Unary/Stream。底部:Mesh/网关更容易识别 HTTP/2 流量。

3.1 Triple 带来什么

能力意义
HTTP/2 多路复用 / 流控与 gRPC 同族传输语义
Unary + Streaming服务端推、双向流等场景
更好的互通与可见性易被网关、Mesh、观测识别
IDL / Protobuf 友好跨语言契约更清晰

3.2 Triple 不是「免费升级」

迁移成本真实存在:

务实路径:新服务 Triple 优先;老服务双注册/双协议过渡;热路径单独压测序列化与 QPS。

4. 序列化选型

方案特点建议场景
Hessian2Java 友好、历史默认纯 Java 内部、存量
Protobuf紧凑、强 schema、跨语言竞价热路径、多语言
Fastjson2 / JSON可读、好调试边缘、低 QPS、排障旁路
Kryo / FST 等快但生态与安全边界要谨慎仅内网可控环境评估

4.1 热路径怎么选

广告竞价 RPC 的症状很直接:

原则:热路径二进制 schema;调试走旁路;禁止在热接口上「图省事用 JSON」。

4.2 兼容性门禁

5. 附件、超时与上下文如何过协议

一次调用除了方法参数,还有:

它们通常走 attachment / header,而不是业务参数。换协议时最容易丢的就是这类上下文——表现为「灰度失效」「链路断追踪」「服务端看不到超时剩余」。迁移 checklist 里应单列 上下文透传对照表

6. 同步、异步与流式(协议视角)

流式能减少「反复建调用」的开销,但会占用连接与服务端状态;广告计费写路径通常仍应 Unary + 明确超时,别为炫技上双向流。

7. 性能与排障清单

  1. 对比包体:同一业务对象在 Hessian2 vs Protobuf 下的大小;
  2. 火焰图:序列化是否占 CPU 大头;
  3. 连接数:实例数 × 连接是否爆炸;是否该连接复用/多路;
  4. 超时是否在服务端生效:还是只在客户端傻等;
  5. 大字段:把画像巨对象塞进同步 RPC,不如拆缓存或异步。

8. AdTech 演进样本

常见演进:

  1. 早期:Dubbo 协议 + Hessian2,纯 Java;
  2. 特征/实验平台多语言渗透 → Triple + Protobuf
  3. 合规要求 mTLS / 统一治理 → Mesh 识别 HTTP/2;
  4. 入口与跨团队 API → 网关,内部仍直连 RPC。

每一阶段保留上一阶段仍高效的部分,比「全站某一天切协议」便宜一个数量级。

9. 生产反模式

10. 常见误解 ↔ 正解

常见误解正解
Triple = 把 Dubbo 包进 HTTP传输、流、互通与生态位都变了
Protobuf 一定更快通常更紧凑;极简对象上差距可能不大,要压测
换序列化不用改 Consumer必须双端一致或可协商
协议层能解决幂等幂等是业务 + Cluster 策略问题
长连接永不断NAT/空闲超时会断,要靠心跳与重连

11. 速查表

协议通了之后,最后一块是「流量怎么被规则塑造、发布如何不抖」——流量治理、Filter 链与优雅上下线


延伸阅读

本系列内部串读:

相关:

一手资料:


views
Share this post on:

Previous Post
Dubbo 深挖 · 流量治理、Filter 链与优雅上下线
Next Post
Dubbo 深挖 · Cluster 容错、负载均衡与路由