1. gRPC 概述
1.1 gRPC 是什么
gRPC 是 Google 开源的高性能远程过程调用(RPC)框架,基于 HTTP/2 协议传输,使用 Protocol Buffers(protobuf) 作为接口定义语言(IDL)和序列化工具。gRPC 允许客户端像调用本地函数一样直接调用远端服务,屏蔽了网络通信、序列化、连接管理等底层细节。
核心特征:gRPC 默认使用 protobuf 进行二进制序列化,数据体积小、解析速度快;基于 HTTP/2 多路复用,支持双向流、头部压缩、单连接并发请求。
gRPC 的典型调用流程如下:
- 定义
.proto文件,声明服务接口与消息结构。 - 使用 protoc 编译器生成客户端和服务端存根代码。
- 服务端实现接口并启动 gRPC 服务。
- 客户端通过生成的存根发起远程调用。
1.2 gRPC 与 RESTful 对比
RESTful 是 Web 服务最广泛的架构风格,基于 HTTP/1.1 和 JSON/XML 文本格式。gRPC 与 RESTful 在设计理念、传输协议、序列化方式、性能表现上存在显著差异。
| 对比维度 | gRPC | RESTful |
|---|---|---|
| 传输协议 | HTTP/2 | HTTP/1.1(主流) |
| 数据格式 | Protobuf(二进制) | JSON / XML(文本) |
| 接口定义 | .proto 文件,强类型 |
OpenAPI / 手动文档,弱类型 |
| 通信模式 | 一元、服务端流、客户端流、双向流 | 请求-响应(一元为主) |
| 序列化性能 | 极快,体积小(JSON 的 1/3~1/10) | 较慢,体积大 |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 代码生成 | 内置代码生成器(protoc) | 需第三方工具(Swagger Codegen 等) |
| 适用场景 | 微服务内部通信、低延迟、流式处理 | 对外 API、浏览器端、简单 CRUD |
选型建议:内部微服务间高频调用、需要流式推送或低延迟的场景优先选择 gRPC;对外暴露给浏览器或第三方、需要广泛兼容性的场景仍以 RESTful 为主。
1.3 gRPC 核心优势
高性能
- Protobuf 二进制序列化:体积小、解析快,比 JSON 序列化快 3~10 倍。
- HTTP/2 多路复用:单 TCP 连接承载多个并发流,消除 HTTP/1.1 队头阻塞。
- 头部压缩:HPACK 算法压缩请求/响应头,减少冗余数据。
- 异步非阻塞:基于 Netty(Java)/ gRPC-Go 等高性能 I/O 框架。
双向流
gRPC 原生支持四种通信模式,远超 RESTful 的单一请求-响应模型:
- 一元 RPC:客户端发送一个请求,服务端返回一个响应。
- 服务端流 RPC:客户端发送一个请求,服务端返回多个消息流。
- 客户端流 RPC:客户端发送多个消息流,服务端返回一个响应。
- 双向流 RPC:双方独立发送和接收消息流,全双工通信。
多语言支持
gRPC 官方支持 Go、Java、Python、C++、C#、Node.js、Ruby、PHP、Dart 等十余种语言。通过 .proto 文件统一定义服务契约,各语言生成对应的客户端/服务端代码,天然实现跨语言互调用。
多语言互调示例:Go 编写的订单服务可以被 Java 的客户端调用,Python 的数据分析服务可以消费 C++ 产生的流式数据。所有语言共享同一份
.proto 契约,无需额外适配层。
1.4 gRPC 应用场景
| 场景 | 说明 | 推荐理由 |
|---|---|---|
| 微服务内部通信 | 服务间高频、低延迟调用 | 高性能、强类型契约、多语言 |
| 实时流式处理 | 日志收集、监控指标、事件流 | 双向流、低延迟、背压控制 |
| 移动端后端 | 手机 App 与后端数据同步 | Protobuf 体积小节省带宽、HTTP/2 减少连接数 |
| 物联网(IoT) | 设备数据上报、远程控制 | 双向流、低功耗、二进制高效 |
| 多语言异构系统 | 不同技术栈团队协作 | 统一契约、代码生成、跨语言 |
| 高性能计算/机器学习 | 分布式训练、模型推理 | 流式传输大张量数据、低延迟 |
注意:gRPC 不适合浏览器端直接调用(需 gRPC-Web 代理),也不适合对延迟不敏感、简单 CRUD 的对外 API 场景。在这些场景下 RESTful 仍是更成熟的选择。