1. gRPC 概述

1.1 gRPC 是什么

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

核心特征:gRPC 默认使用 protobuf 进行二进制序列化,数据体积小、解析速度快;基于 HTTP/2 多路复用,支持双向流、头部压缩、单连接并发请求。

gRPC 的典型调用流程如下:

  1. 定义 .proto 文件,声明服务接口与消息结构。
  2. 使用 protoc 编译器生成客户端和服务端存根代码。
  3. 服务端实现接口并启动 gRPC 服务。
  4. 客户端通过生成的存根发起远程调用。
gRPC 调用流程 客户端 gRPC Stub 服务端 gRPC Service HTTP/2 传输 多路复用 · 双向流 Protobuf 二进制 说明 1. 客户端通过本地 Stub 发起调用,Stub 将请求序列化为 Protobuf 二进制。 2. HTTP/2 多路复用传输,单连接承载多个并发请求/响应。 3. 服务端反序列化后执行业务逻辑,返回结果同样经 Protobuf 序列化。

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 四种通信模式 一元 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 仍是更成熟的选择。