08 · gRPC 与流式 RPC
微服务内部通信常看到 gRPC:性能更好、接口有约束、支持流式。本篇讲它与 REST 的取舍、四种调用模式与落地注意;服务间 API 风格总览见 C02 API 设计。
速览卡
| 项 | 内容 |
|---|---|
| 一句话定位 | gRPC 是什么、什么时候用它、流式怎么落地 |
| 核心内容 | protobuf、四种模式、与 REST 取舍、HTTP/2 依赖 |
| 读完能回答 | 内部服务为什么爱用 gRPC?什么时候不该用? |
| 相关板块 | N04 HTTP | N09 代理与网关 | C05 服务架构 |
一、它是什么
text
定义接口(.proto)→ 生成客户端/服务端代码 → HTTP/2 上传输| 特点 | 说明 |
|---|---|
| 接口约束 | .proto 即契约,改字段有明确兼容规则 |
| 二进制序列化 | protobuf 比 JSON 更小更快 |
| 传输层 | 基于 HTTP/2,天然支持多路复用与流式 |
| 跨语言 | 一套 .proto 生成各语言代码 |
二、四种调用模式
| 模式 | 描述 | 场景 |
|---|---|---|
| Unary | 一次请求一次响应 | 普通 RPC,类 REST |
| Server streaming | 请求一次,响应多次 | 日志、进度推送 |
| Client streaming | 请求多次,响应一次 | 批量上传 |
| Bidirectional | 双向流 | 实时协同、对话 |
三、与 REST 的取舍
| 维度 | REST | gRPC |
|---|---|---|
| 契约 | 无强制 schema | .proto 强约束 |
| 序列化 | JSON(可读) | 二进制(高效) |
| 浏览器 | 天然支持 | 需 gRPC-Web 代理 |
| 调试 | curl 直接看 | 需 grpcurl 等工具 |
| 适合 | 对外 API、浏览器端 | 内部服务、流式场景 |
判断框架:对外暴露给浏览器 → 优先 REST;服务间高性能/流式/强契约 → gRPC。硬要用 gRPC 对外会多一层代理成本。
四、落地注意
| 事项 | 说明 |
|---|---|
| HTTP/2 | 必需,代理层要支持 |
| 负载均衡 | 需客户端感知实例列表,配合注册中心 |
| 版本兼容 | 字段号不可复用,遵循 protobuf 兼容规则 |
| 调试 | 用 grpcurl、gRPC 反射 |
五、自检清单
- [ ] 能说清 gRPC 为什么快、为什么强约束
- [ ] 能列出四种调用模式并各举一例
- [ ] 能按调用方判断 REST vs gRPC
- [ ] 知道 gRPC 依赖 HTTP/2 与相应的部署注意
六、常见误区
| 误区 | 事实 |
|---|---|
| "gRPC 一定比 REST 好" | 浏览器与对外 API 场景它反而麻烦 |
| "gRPC 不用管版本" | 字段号复用会直接破坏兼容 |
| "gRPC 不支持浏览器" | 需要 gRPC-Web 或代理桥接 |
七、动手练习
练习 A:跑一个示例
用官方 echo 示例生成代码,跑通 unary 与 server streaming 两种调用,观察请求耗时。
练习 B:对比序列化
同一份数据结构分别用 JSON 与 protobuf 序列化,对比字节数与耗时。
练习 C:看 HTTP/2
抓包观察 gRPC 流量,确认底层是 HTTP/2 帧(对照 N11 抓包)。
相关文档
本区
- 04 · HTTP 与 HTTPS 深入 —— HTTP/2 承载层
- 09 · 代理与反向代理与API网关 —— 网关对 HTTP/2 的支持
其他域
- API 设计:REST / gRPC / GraphQL —— API 风格总览
- 服务架构:分层/微服务/网关/熔断限流 —— 服务间通信与注册中心