gRPC

基于 HTTP/2 与 Protocol Buffers 的 RPC 框架,支持四种调用形态(一元、服务端流、客户端流、双向流)与跨语言代码生成,适合内网服务间高吞吐调用。

gRPC 是什么

gRPC 是基于 HTTP/2 与 Protocol Buffers 的远程调用框架,接口与消息都用接口描述语言定义并生成跨语言代码。它支持一元、服务端流、客户端流与双向流四种调用形态,适合内网服务之间的高吞吐、低延迟调用。

什么时候选它

内部服务间调用、需要强类型契约、需要流式传输的场景,gRPC 的优势很明显:代码生成免去手写序列化,字段编号机制让接口演进有明确规则,多路复用降低了连接开销。对外公开接口、需要浏览器直接访问或需要人类可读的调试体验时,HTTP 加 JSON 通常更省事。常见架构是对外 REST、对内 gRPC。

四种调用形态

形态语义典型场景
一元一次请求一次响应常规查询与命令
服务端流一次请求多次响应订阅推送、大结果集
客户端流多次请求一次响应批量上报、文件上传
双向流双方持续互发实时协作、长会话

基本信息

传输基于 HTTP/2,多路复用与头部压缩
契约接口描述语言生成代码,字段编号决定兼容性
兼容规则新增字段用新编号,删除字段要保留编号不再复用
超时通过截止时间传递,链路上逐跳扣减

典型使用场景

  • 服务间内部调用:强类型契约降低联调成本
  • 大结果集返回:用服务端流分批推送而非一次加载
  • 批量上报:客户端流合并多次写入
  • 实时通信:双向流承载长会话与协作场景
  • 多语言服务互联:同一份接口定义生成各语言代码

与 REST 怎么取舍

REST 加 JSON 的优势是可读、可调试、生态工具丰富,适合对外接口与变化频繁的业务;gRPC 的优势是强类型契约、代码生成与更低的序列化开销,适合内部高频调用。选择时看调用方的确定性:调用方是自己团队的服务,契约可以集中治理;调用方是外部开发者,可读性与接入门槛的权重更高。

浏览器直连需要 gRPC-Web 与代理支持;对外公开 API 与内网 RPC 的选型可以不同,不必强求技术栈统一。

易错点

  • 用 gRPC 直连浏览器却未部署 gRPC-Web 转换层,前端无法调用
  • 流式接口未设超时与流控,连接长期挂起逐步耗尽资源
  • 复用了已删除字段的编号,新旧版本解析出错误数据且难以排查
  • 把 gRPC 用作对外公开接口,客户端接入成本与调试难度被低估

数据来源与参考

  • gRPC 官方文档(grpc.io)
  • Google API 设计指南:gRPC 章节
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌