1. gRPC 概述
1.1 gRPC 的定义
gRPC 是由 Google 开源的高性能、跨语言的远程过程调用(RPC)框架。它基于 HTTP/2 协议传输,使用 Protocol Buffers(protobuf) 作为接口定义语言(IDL)和序列化工具。gRPC 允许客户端像调用本地函数一样直接调用另一台机器上的服务方法,屏蔽了网络通信、序列化与反序列化的复杂性。
核心特征:gRPC 默认采用 protobuf 进行数据编码,体积小、解析快;基于 HTTP/2 实现多路复用、流式传输和头部压缩,显著降低延迟。
1.2 gRPC 与 REST 对比
REST 是目前 Web 服务中最流行的架构风格,而 gRPC 在微服务、高性能场景中逐渐成为首选。两者在多个维度存在显著差异:
| 对比维度 | gRPC | REST |
|---|---|---|
| 传输协议 | HTTP/2(强制) | HTTP/1.1 或 HTTP/2 |
| 数据格式 | Protocol Buffers(二进制) | JSON / XML(文本) |
| 接口定义 | .proto 文件(强类型契约) |
OpenAPI / Swagger(文档驱动) |
| 通信模式 | 一元、服务端流、客户端流、双向流 | 请求-响应(主流),SSE 有限支持流 |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 代码生成 | 内置代码生成器(protoc) | 需第三方工具(如 OpenAPI Generator) |
| 性能 | 高(二进制编码 + HTTP/2 多路复用) | 中(文本编码 + 连接开销) |
选型建议:如果服务间通信需要低延迟、高吞吐、强契约约束,优先选择 gRPC;如果面向浏览器、移动端或需要广泛生态兼容,REST 仍是稳妥选择。
1.3 gRPC 核心优势
gRPC 在微服务架构、分布式系统中具备以下不可替代的优势:
- 高性能序列化:Protocol Buffers 将数据压缩为紧凑的二进制格式,序列化/反序列化速度是 JSON 的 3~10 倍,体积减少 30%~70%。
- HTTP/2 多路复用:单一 TCP 连接可并行处理多个请求,消除 HTTP/1.1 的队头阻塞问题,降低连接开销。
- 双向流式通信:支持服务端流、客户端流和双向流,适合实时推送、大数据传输、聊天等场景。
- 强类型契约:
.proto文件同时定义服务接口和消息结构,生成客户端/服务端桩代码,编译期即可发现接口不匹配。 - 多语言互操作:官方支持 C++、Java、Python、Go、Node.js 等 11+ 语言,跨语言调用无需额外适配。
- 内置负载均衡与健康检查:gRPC 提供标准的健康检查协议和负载均衡策略(如 round_robin、pick_first)。
1.4 gRPC 应用场景
gRPC 并非万能方案,但在以下场景中表现尤为突出:
- 微服务间通信:服务间需要高频、低延迟调用,gRPC 的二进制编码和 HTTP/2 多路复用可大幅降低网络开销。
- 实时数据流处理:如物联网设备数据上报、股票行情推送、日志收集等,gRPC 双向流支持持续数据交换。
- 多语言异构系统:团队使用不同编程语言开发服务,gRPC 的跨语言代码生成保证接口一致性。
- 移动端与后端通信:通过 gRPC-Web 或 gRPC 原生客户端,减少移动端网络请求的带宽消耗。
- 高性能计算与分布式系统:如分布式数据库节点间通信、机器学习模型推理服务,需要极致吞吐和低延迟。
注意:gRPC 不适合浏览器直接调用(需 gRPC-Web 代理),也不适合对文本可读性要求极高的调试场景。在这些情况下,REST + JSON 仍是更合适的选择。