gRPC 是什么
gRPC 是基于 HTTP/2 与 Protocol Buffers 的远程调用框架,接口与消息都用接口描述语言定义并生成跨语言代码。它支持一元、服务端流、客户端流与双向流四种调用形态,适合内网服务之间的高吞吐、低延迟调用。
什么时候选它
内部服务间调用、需要强类型契约、需要流式传输的场景,gRPC 的优势很明显:代码生成免去手写序列化,字段编号机制让接口演进有明确规则,多路复用降低了连接开销。对外公开接口、需要浏览器直接访问或需要人类可读的调试体验时,HTTP 加 JSON 通常更省事。常见架构是对外 REST、对内 gRPC。
四种调用形态
| 形态 | 语义 | 典型场景 |
|---|---|---|
| 一元 | 一次请求一次响应 | 常规查询与命令 |
| 服务端流 | 一次请求多次响应 | 订阅推送、大结果集 |
| 客户端流 | 多次请求一次响应 | 批量上报、文件上传 |
| 双向流 | 双方持续互发 | 实时协作、长会话 |
基本信息
| 传输 | 基于 HTTP/2,多路复用与头部压缩 |
|---|---|
| 契约 | 接口描述语言生成代码,字段编号决定兼容性 |
| 兼容规则 | 新增字段用新编号,删除字段要保留编号不再复用 |
| 超时 | 通过截止时间传递,链路上逐跳扣减 |
典型使用场景
- 服务间内部调用:强类型契约降低联调成本
- 大结果集返回:用服务端流分批推送而非一次加载
- 批量上报:客户端流合并多次写入
- 实时通信:双向流承载长会话与协作场景
- 多语言服务互联:同一份接口定义生成各语言代码
与 REST 怎么取舍
REST 加 JSON 的优势是可读、可调试、生态工具丰富,适合对外接口与变化频繁的业务;gRPC 的优势是强类型契约、代码生成与更低的序列化开销,适合内部高频调用。选择时看调用方的确定性:调用方是自己团队的服务,契约可以集中治理;调用方是外部开发者,可读性与接入门槛的权重更高。
浏览器直连需要 gRPC-Web 与代理支持;对外公开 API 与内网 RPC 的选型可以不同,不必强求技术栈统一。