1. gRPC 基础概念
1.1 gRPC 是什么
gRPC 是由 Google 开源的高性能远程过程调用(RPC)框架,基于 HTTP/2 协议传输,使用 Protocol Buffers(Protobuf)作为接口定义语言(IDL)和序列化工具。它允许客户端像调用本地函数一样直接调用远程服务,屏蔽了网络通信、序列化、反序列化等底层细节。
gRPC 的设计目标是在微服务架构、移动端-服务端通信、多语言异构系统中提供低延迟、高吞吐、强类型的数据传输能力。目前支持 C++、Java、Python、Go、Node.js 等十余种语言。
核心定位:gRPC 不是简单的 HTTP 封装,而是一套完整的 RPC 通信协议栈,包含服务定义、序列化、传输、认证、负载均衡、健康检查等内置能力。
1.2 gRPC 与 REST 对比
REST 是目前最广泛的 API 设计风格,基于 HTTP/1.1 协议,使用 JSON/XML 格式传输。gRPC 与 REST 在协议、序列化、流式支持、性能等方面存在显著差异。下表从多个维度进行对比:
| 对比维度 | gRPC | REST |
|---|---|---|
| 底层协议 | HTTP/2(强制) | HTTP/1.1(主流),部分支持 HTTP/2 |
| 数据格式 | Protocol Buffers(二进制) | JSON / XML(文本) |
| 接口定义 | .proto 文件(强类型、代码生成) | OpenAPI / Swagger(文档驱动) |
| 流式通信 | 原生支持:单向流、双向流 | 不支持(需额外 WebSocket) |
| 序列化速度 | 极快(二进制、零拷贝) | 较慢(文本解析、反射) |
| 消息体积 | 小(压缩、无冗余字段名) | 大(字段名重复、空格) |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 工具生态 | protoc、grpcurl、BloomRPC | curl、Postman、Swagger UI |
关键结论:gRPC 在内部微服务通信、低延迟场景、流式数据处理中优势明显;REST 在浏览器端、开放 API、简单 CRUD 场景中更通用。两者并非替代关系,而是互补。
1.3 gRPC 核心优势
1.3.1 HTTP/2 协议
HTTP/2 是 gRPC 的传输基石,相比 HTTP/1.1 带来以下关键改进:
- 多路复用(Multiplexing):单个 TCP 连接可并行处理多个请求-响应,消除 HTTP/1.1 的队头阻塞问题。
- 头部压缩(HPACK):使用 HPACK 算法压缩请求/响应头,减少冗余头部开销,尤其适合高频小请求场景。
- 服务器推送(Server Push):服务端可主动向客户端推送资源,减少请求往返次数。
- 二进制分帧:所有通信以二进制帧为单位传输,解析效率远高于文本协议。
- 流优先级:支持设置流的优先级,关键请求可优先处理。
1.3.2 Protocol Buffers(Protobuf)
Protobuf 是 gRPC 的默认序列化协议,使用 .proto 文件定义消息结构和服务接口。相比 JSON,Protobuf 具有以下优势:
- 强类型约束:字段类型、编号、默认值在编译期确定,避免运行时类型错误。
- 二进制序列化:编码后体积仅为 JSON 的 1/3 ~ 1/10,解析速度提升 5~20 倍。
- 向后兼容:支持字段编号扩展,新增字段不影响旧客户端。
- 代码生成:通过 protoc 编译器自动生成客户端 Stub 和服务端骨架代码,减少手写样板代码。
性能对比数据:在同等数据量下,Protobuf 序列化耗时约为 JSON 的 20%~30%,反序列化耗时约为 JSON 的 15%~25%。对于 10KB 级别的消息,Protobuf 可节省 60%~80% 的传输带宽。
1.3.3 双向流(Bidirectional Streaming)
gRPC 原生支持四种通信模式,其中双向流是最具特色的能力:
| 通信模式 | 描述 | 典型场景 |
|---|---|---|
| 一元 RPC(Unary) | 客户端发送 1 个请求,服务端返回 1 个响应 | 传统 CRUD、查询接口 |
| 服务端流(Server Streaming) | 客户端发送 1 个请求,服务端返回多个响应 | 日志推送、数据订阅 |
| 客户端流(Client Streaming) | 客户端发送多个请求,服务端返回 1 个响应 | 文件上传、批量数据提交 |
| 双向流(Bidirectional Streaming) | 客户端和服务端独立发送多个消息,顺序不固定 | 实时聊天、AI 推理流、游戏同步 |
压测注意:双向流模式在压测时需特别关注流生命周期管理、背压(Backpressure)控制和内存泄漏问题。流数量过多可能导致连接池耗尽或 OOM。
1.4 本章小结
- gRPC 是基于 HTTP/2 + Protobuf 的高性能 RPC 框架,适合微服务内部通信。
- 与 REST 相比,gRPC 在性能、流式支持、强类型定义上优势明显,但浏览器兼容性较弱。
- HTTP/2 的多路复用、头部压缩、二进制分帧是 gRPC 高性能的传输基础。
- Protobuf 提供紧凑的二进制序列化,体积小、速度快、类型安全。
- 四种通信模式中,双向流是压测中最复杂也最值得深入测试的模式。