很多人把 gRPC 理解成:
- “因为是二进制,所以快”
- “因为是 HTTP/2,所以快”
- “因为是 Google 出的,所以快”
都太浅。
gRPC 的性能心智,本质上来自下面几层叠加。
#1. Protobuf:货箱更小、解析更直接
在默认组合里,gRPC 常用 Protobuf 作为 IDL 和消息格式。
它的优势不是“神秘”,而是很工程化:
- 二进制体积通常更紧凑
- 强类型,字段明确
- 代码生成后,读写路径很直接
- 跨语言一致性强
JSON 更像:人眼容易读的纸面表格
Protobuf 更像:机器按标准尺寸封装好的货箱#2. HTTP/2:一条专线里跑很多并发车道
HTTP/2 让同一条连接里能并发多个流,减少传统“开很多连接”的成本。
一条专线连接
├── Stream 1:查路线
├── Stream 2:推送路况
├── Stream 3:上传摄像头数据
└── Stream 4:双向调度指令这带来的心智是:
gRPC 不是“一次请求开一条新路”,而更像“长期保留一条高质量专线,在上面复用很多车道”。
#3. 代码生成:少写胶水层,少犯低级错
REST 项目里,经常能看到这些重复劳动:
- 手写 DTO
- 手写序列化
- 手写 URL
- 手写参数映射
- 手写接口文档同步
gRPC 把这层重复劳动前置进 .proto,然后让工具生成。
这不只是“省时间”,更重要的是:
减少系统之间因为人为拼接字符串、字段不一致、文档滞后导致的协作损耗。
#4. Streaming:持续传输,而不是假装所有通信都只有“一问一答”
真实世界的系统通信,很多不是“打一枪就走”:
- 日志持续上报
- 路况持续推送
- 模型推理结果分块返回
- 设备双向控制
- 音视频、传感器、实时同步
gRPC 把“流”当成一等公民,这一点非常关键。
#5. 但要记住:高性能不是白送的
gRPC 并不代表:
- 任何场景都比 REST 快
- 浏览器里天然最好用
- 调试一定最方便
- 外部开放接口一定更合适
它更像高等级专线,不是万能交通工具。