1. gRPC 基础概念

1.1 gRPC 是什么

gRPC 是由 Google 开源的高性能远程过程调用(RPC)框架,基于 HTTP/2 协议传输,使用 Protocol Buffers(Protobuf)作为接口定义语言(IDL)和序列化工具。它允许客户端像调用本地函数一样直接调用远程服务,屏蔽了网络通信、序列化、反序列化等底层细节。

gRPC 的设计目标是在微服务架构、移动端-服务端通信、多语言异构系统中提供低延迟、高吞吐、强类型的数据传输能力。目前支持 C++、Java、Python、Go、Node.js 等十余种语言。

核心定位:gRPC 不是简单的 HTTP 封装,而是一套完整的 RPC 通信协议栈,包含服务定义、序列化、传输、认证、负载均衡、健康检查等内置能力。
gRPC 通信架构概览 客户端 gRPC Stub (自动生成) 服务端 gRPC Server (服务实现) HTTP/2 传输层 多路复用 · 头部压缩 · 双向流 接口定义语言(IDL) Protocol Buffers (.proto 文件)

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):服务端可主动向客户端推送资源,减少请求往返次数。
  • 二进制分帧:所有通信以二进制帧为单位传输,解析效率远高于文本协议。
  • 流优先级:支持设置流的优先级,关键请求可优先处理。
HTTP/2 多路复用 vs HTTP/1.1 串行连接 HTTP/1.1 — 串行阻塞 请求1 请求2(等待请求1完成) 请求3(等待请求2完成) HTTP/2 — 多路复用 请求1 请求2 请求3 响应1 响应2 响应3 单个 TCP 连接内并行传输 请求与响应交错,无阻塞 连接复用率提升 5~10 倍

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。
gRPC 四种通信模式 一元 RPC 请求 → ← 响应 服务端流 请求 → ← 响应流 客户端流 请求流 → ← 响应 双向流 请求流 → ← 响应流 双向流是压测重点 流数量、消息频率、背压策略直接影响吞吐和稳定性 压测时需监控:流创建速率、消息延迟、内存占用

1.4 本章小结

  • gRPC 是基于 HTTP/2 + Protobuf 的高性能 RPC 框架,适合微服务内部通信。
  • 与 REST 相比,gRPC 在性能、流式支持、强类型定义上优势明显,但浏览器兼容性较弱。
  • HTTP/2 的多路复用、头部压缩、二进制分帧是 gRPC 高性能的传输基础。
  • Protobuf 提供紧凑的二进制序列化,体积小、速度快、类型安全。
  • 四种通信模式中,双向流是压测中最复杂也最值得深入测试的模式。