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 在微服务架构、分布式系统中具备以下不可替代的优势:

  1. 高性能序列化:Protocol Buffers 将数据压缩为紧凑的二进制格式,序列化/反序列化速度是 JSON 的 3~10 倍,体积减少 30%~70%。
  2. HTTP/2 多路复用:单一 TCP 连接可并行处理多个请求,消除 HTTP/1.1 的队头阻塞问题,降低连接开销。
  3. 双向流式通信:支持服务端流、客户端流和双向流,适合实时推送、大数据传输、聊天等场景。
  4. 强类型契约:.proto 文件同时定义服务接口和消息结构,生成客户端/服务端桩代码,编译期即可发现接口不匹配。
  5. 多语言互操作:官方支持 C++、Java、Python、Go、Node.js 等 11+ 语言,跨语言调用无需额外适配。
  6. 内置负载均衡与健康检查:gRPC 提供标准的健康检查协议和负载均衡策略(如 round_robin、pick_first)。
gRPC 核心优势架构图 gRPC 核心引擎 高性能序列化 HTTP/2 多路复用 双向流式通信 强类型契约 多语言互操作 负载均衡与健康检查 说明: gRPC 将高性能序列化、HTTP/2 多路复用、双向流和强类型契约整合为统一框架, 显著降低微服务间通信延迟,提升开发效率和系统可靠性。

1.4 gRPC 应用场景

gRPC 并非万能方案,但在以下场景中表现尤为突出:

  • 微服务间通信:服务间需要高频、低延迟调用,gRPC 的二进制编码和 HTTP/2 多路复用可大幅降低网络开销。
  • 实时数据流处理:如物联网设备数据上报、股票行情推送、日志收集等,gRPC 双向流支持持续数据交换。
  • 多语言异构系统:团队使用不同编程语言开发服务,gRPC 的跨语言代码生成保证接口一致性。
  • 移动端与后端通信:通过 gRPC-Web 或 gRPC 原生客户端,减少移动端网络请求的带宽消耗。
  • 高性能计算与分布式系统:如分布式数据库节点间通信、机器学习模型推理服务,需要极致吞吐和低延迟。
gRPC 典型应用场景 微服务间通信 高频低延迟调用 实时数据流处理 物联网/行情/日志 多语言异构系统 跨语言代码生成 移动端与后端通信 gRPC-Web / 原生客户端 高性能计算与分布式系统 数据库 / ML 推理 场景选择原则: • 内部服务间通信优先选择 gRPC,外部客户端接口优先选择 REST • 需要流式推送或双向通信时,gRPC 是唯一成熟的 HTTP 原生方案 • 多语言团队应统一使用 .proto 文件作为接口契约,避免手动维护文档
注意:gRPC 不适合浏览器直接调用(需 gRPC-Web 代理),也不适合对文本可读性要求极高的调试场景。在这些情况下,REST + JSON 仍是更合适的选择。