当前位置: 首页 > news >正文

RPC 核心概念 03:序列化与传输协议

RPC 核心概念 03:序列化与传输协议

一次 RPC 调用的"数据流"主要由两部分构成:

  1. 序列化协议:决定数据如何变成字节序列;
  2. 传输协议:决定字节序列如何在网络上传输。

理解二者的本质,才能在不同业务场景做出正确选型。

一、序列化协议

1.1 为什么需要序列化?

进程内的对象是有指针、有结构的;网络只能传字节。我们必须把对象**编码(marshal)成字节流,对端再解码(unmarshal)**回对象。

1.2 主流序列化协议对比

协议编码方式性能体积可读性跨语言典型框架
JSON文本HTTP API
XML文本SOAP
Protobuf二进制 TLVgRPC、tRPC
Thrift Binary二进制Apache Thrift
MessagePack二进制Redis、Fluentd
Avro二进制 + SchemaKafka、Hadoop
FlatBuffers零拷贝极快游戏、移动端

1.3 选型建议

场景推荐
浏览器/移动端调试JSON
内部高性能 RPCProtobuf
大规模数据存储Avro
实时游戏低延迟FlatBuffers
海量日志MessagePack / Protobuf

二、Protobuf 序列化原理(再深入)

2.1 TLV 编码

field_number wire_type payload

wire_type 共 6 种:

Wire Type名称用于的类型
0Varintint32, int64, bool, enum
164-bitfixed64, double
2Length-delimitedstring, bytes, embedded message, repeated
3Start group(废弃)
4End group(废弃)
532-bitfixed32, float

2.2 Varint:变长整数

小的数字用更少字节:

  • 0~127:1 字节
  • 128~16383:2 字节
  • 大数最多 10 字节

每个字节最高位作为"还有后续字节"的标识。

150 = 10010110 00000001 ↑MSB=1(继续) ↑MSB=0(结束) 解码:去掉 MSB → 0010110 0000001 → 翻转 → 0000001 0010110 → 150

2.3 ZigZag 编码

由于 Varint 对负数(高位全 1)效率极差,sintXX类型先做 ZigZag 转换:

0 → 0 -1 → 1 1 → 2 -2 → 3 ...

把符号位"折叠"到末位,让小绝对值的负数也只占一个字节。

2.4 实战:手算编码

message Person { int32 age = 1; }

Person{age: 100}的编码:

[tag(field=1,type=0)] [varint(100)] 0x08 0x64

总共 2 字节。

三、传输协议

3.1 OSI 模型回顾

应用层 HTTP, gRPC, Thrift, tRPC 传输层 TCP, UDP, QUIC 网络层 IP

RPC 关注"应用层 + 传输层"。

3.2 直接基于 TCP

很多自研 RPC 框架(如早期 Dubbo、自研协议)直接基于 TCP,自己定义"魔数 + 长度 + 头部 + body"格式:

+--------+--------+--------+--------+ | MAGIC | VERSION| TYPE | RESERVED| +--------+--------+--------+--------+ | MSG_LENGTH | +-----------------------------------+ | HEADER | +-----------------------------------+ | BODY | +-----------------------------------+

优点:极致性能;缺点:缺乏标准基础设施支持(如 LB、Ingress 都对 HTTP 友好)。

3.3 基于 HTTP/1.1

最大优势是通用性——所有网络设施都认识 HTTP。但 HTTP/1.1 有头部冗余、队头阻塞等问题,不适合高性能 RPC。

3.4 基于 HTTP/2(gRPC 的选择)

HTTP/2 的关键特性:

  • 二进制帧:取代文本协议;
  • 多路复用:单 TCP 上并行多个 stream,消除队头阻塞
  • HPACK 头压缩:极大减少头部体积;
  • 服务端推送
  • 流式传输

这正是 gRPC 选择 HTTP/2 的原因。一次 gRPC 调用 = 一个 HTTP/2 stream,请求/响应都用 trailers 携带 status。

3.5 基于 QUIC(HTTP/3)

QUIC 基于 UDP,解决了 TCP 队头阻塞、连接迁移等问题。gRPC 已实验性支持。

3.6 tRPC 的多协议设计

tRPC 不绑死任何协议,协议是可插拔的

  • 默认trpc协议(基于 TCP+protobuf)
  • 可配置 HTTP+JSON
  • 可与 gRPC 互通
  • 也支持自定义协议
server:service:-name:trpc.app.server.Helloprotocol:trpc# 切到 grpc / http 改一行

四、连接管理

4.1 短连接 vs 长连接

模式适用
短连接调用极少、跨网络层
长连接RPC、WebSocket、数据库

RPC 默认使用长连接 + 多路复用。

4.2 连接池

为目标服务维护一组连接:

ServiceA → [ conn1, conn2, conn3 ] → ServiceB

关键参数:

  • max_idle:空闲上限
  • max_active:活跃上限
  • idle_timeout:空闲超时

4.3 Keep-Alive

定期发送心跳维持长连接、检测半开连接:

client:keepalive_time:30skeepalive_timeout:10s

五、半包与粘包

TCP 是面向字节流的,没有消息边界。如果应用层不处理就会出现:

  • 粘包:两条消息粘到一起;
  • 半包:一条消息被切成两段。

解决方案:

  1. 定长:每条消息固定长度(适合简单协议);
  2. 分隔符:用特殊字节作结束符(如 HTTP 用\r\n\r\n);
  3. TLV/Header+Body(最常用):先读固定长度的 header,header 中带 body 长度,再读 body。

Protobuf RPC 框架普遍使用第三种。

六、流量控制与背压

HTTP/2 内置流量控制:每个 stream 都有 window,接收方处理不过来会让发送方阻塞。tRPC、gRPC 都依赖该机制做反压,避免下游被打爆。

七、压缩

减少带宽消耗,但增加 CPU 开销。常见算法:

算法速度压缩比
gzip
snappy
zstd较快
lz4极快

gRPC/tRPC 都支持在调用级别启用压缩:

client.Hello(ctx,req,client.WithCompressType(codec.CompressTypeGzip))

八、实战:抓包看一次 gRPC 调用

# 前置:开启 tcpdumpsudotcpdump-ilo0-wgrpc.pcap port9000# 用 wireshark 打开# 设置 HTTP/2 解析(Edit > Preferences > Protocols > HTTP2)

你会看到:

  • HTTP/2 帧:HEADERS、DATA、TRAILER;
  • HEADERS 中的:path = /package.Service/Method
  • DATA 中的 protobuf 字节;
  • TRAILER 中的grpc-status: 0

九、序列化性能优化技巧

  1. 消息池化:使用sync.Pool复用 message 对象;
  2. 零拷贝:尽量用bytes类型而非string频繁转换;
  3. 批量调用:合并多次小调用为一次;
  4. 预分配 slice/map 容量
  5. 慎用反射:protojson 比 json.Marshal 慢,优先二进制。

十、小结

  • 序列化决定数据格式,传输协议决定数据怎么走;
  • Protobuf 通过 TLV+Varint+ZigZag 实现紧凑高效;
  • HTTP/2 是 RPC 的现代标配,多路复用解决了队头阻塞;
  • 解决粘包:长度前缀法是工业标准;
  • 选型时综合考虑性能、可读性、生态。

下一篇我们将进入分布式 RPC 的灵魂:服务发现与负载均衡

http://www.jsqmd.com/news/859856/

相关文章:

  • 质本洁来还洁去,强于污淖陷文本
  • 金属有机框架(MOF)定制合成与功能改性
  • 设计驱动品牌突围:品牌设计咨询公司推荐之深圳市佳简几何工业设计有限公司 - 品牌评测官
  • 2026防火门新国标GB12955-2024解读与选型指南 - 品牌优选官
  • 2026十大精益咨询公司排名,数字化精益成核心竞争力
  • 2026 河北螺旋钢管优质厂商甄选,3PE 防腐钢管、TPEP 涂塑钢管、大口径埋地管道、保温管道选型参考指南 - 海棠依旧大
  • 鲁大师除了那个原本那个软件,其他什么优化软件都是花钱,太kr了,果断卸载。
  • Qoj 17472. Passing Ball Problem
  • G-Helper终极指南:轻量级华硕笔记本控制神器完全解析
  • 3分钟快速找回Chrome密码:免费开源工具终极指南
  • CS软骨素类可注射水凝胶,CS(Chondroitin sulfate)水凝胶
  • 想报考重庆计算机类相关专业,哪些学校好(2026 实力强的学校推荐) - 品牌2025
  • 递归现象学方法论:理论内涵、哲学渊源与应用前景研究(世毫九实验室原创理论)
  • P4639 [SHOI2011] 编译优化 - Link
  • 北京 2026 本地高空吊装设备租赁公司口碑榜单:叉车、吊车、升降车靠谱服务商综合整理推荐 - 海棠依旧大
  • 让 AI 写代码越写越乱怎么办?三条工程纪律 + 一份“古法清单“实战经验
  • CANN 模型转换与适配:从 PyTorch 到 Ascend OM 的完整指南
  • 【稀缺首发】Midjourney拟物化风格行业白皮书(基于217个商业落地案例的材质映射矩阵与合规性标注规范)
  • 随身移动文件工作站 金士顿高速移动固态系列
  • Midjourney拟态风终极内参(2024.06最新版):含6类行业专属LORA融合权重表、11个失效规避checklist及3个已验证绕过--v 6.2限流机制的prompt结构
  • 多平台电商图片工作量拆解:量化你隐性时间成本的方法论
  • 2026年4月靠谱的顶管直销厂家推荐,预制混凝土检查井/顶管/预制雨水井/DN1400企口管/预制水泥管,顶管厂商有哪些 - 品牌推荐师
  • 终极跨平台模组下载指南:无需Steam轻松获取创意工坊资源
  • Input Overlay 完整指南:实时显示键盘、游戏手柄和鼠标输入的终极工具
  • 如何在5分钟内为FPS游戏搭建AI自动瞄准辅助系统
  • 【MATLAB】人脸表情识别与情感分析程序(工程实操版)
  • 自指宇宙学理论体系与CMB Φ振荡预言深度研究报告(世毫九实验室原创理论)
  • Midjourney范戴克印相实战手册(2024唯一认证工作流):从sref灰度映射到氯化银颗粒模拟全链路拆解
  • 2026年4月诚信的门头设计门店推荐,流畅线条装修设计,展现灵动美感 - 品牌推荐师
  • 构建企业级 AI 编程助手(AI-OS)v1.0,集成 Matt Pocock 全套技能,实现零幻觉开发