1. gRPC 概述:gRPC 是什么、gRPC 与 REST 对比、gRPC 核心概念、gRPC 应用场景
1.1 gRPC 是什么
gRPC 是由 Google 开源的高性能、跨语言的远程过程调用(RPC)框架。它基于 HTTP/2 协议传输,使用 Protocol Buffers(protobuf) 作为接口定义语言(IDL)和序列化工具。gRPC 允许客户端像调用本地函数一样直接调用另一台机器上的服务端方法,屏蔽了网络通信、序列化、反序列化等底层细节。
核心特征:gRPC 默认使用 protobuf 进行数据序列化,体积小、速度快;基于 HTTP/2 实现多路复用、流式传输和头部压缩;支持双向流、服务端流、客户端流等多种通信模式。
1.2 gRPC 与 REST 对比
REST 是目前最流行的 API 设计风格,而 gRPC 在微服务内部通信、高性能场景下逐渐成为首选。下表从多个维度对比两者的差异:
| 对比维度 | gRPC | REST |
|---|---|---|
| 协议 | HTTP/2(强制) | HTTP/1.1 或 HTTP/2 |
| 数据格式 | Protocol Buffers(二进制) | JSON / XML(文本) |
| 接口定义 | .proto 文件(强类型契约) |
OpenAPI / Swagger(文档驱动) |
| 通信模式 | 一元、服务端流、客户端流、双向流 | 请求-响应(一元为主) |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 性能 | 高(二进制序列化 + 多路复用) | 中(JSON 解析 + 连接开销) |
| 代码生成 | 内置 protoc 编译器,自动生成客户端/服务端桩代码 | 需第三方工具(如 OpenAPI Generator) |
| 适用场景 | 微服务内部通信、实时流处理、IoT、移动端 | 对外公开 API、Web 应用、资源导向系统 |
选型建议:如果系统对延迟敏感、需要流式通信、或者服务间调用频繁,优先选择 gRPC;如果 API 需要被浏览器直接调用、或者面向第三方开发者公开,REST 仍然是更通用的选择。
1.3 gRPC 核心概念
理解 gRPC 的四个核心概念是掌握整个框架的基础:Service、Stub、Channel 和 Protocol Buffers。
- Service(服务):在
.proto文件中定义的一组 RPC 方法集合。每个方法指定输入消息类型和输出消息类型。服务是 gRPC 契约的核心。 - Stub(桩代码):由 protoc 编译器自动生成的客户端代理代码。客户端通过 Stub 调用远程方法,Stub 负责将请求序列化、发送、接收响应并反序列化。
- Channel(通道):客户端与 gRPC 服务端之间的持久化连接抽象。一个 Channel 可以复用多个 RPC 调用,支持负载均衡、连接池和重连策略。
- Protocol Buffers(协议缓冲区):gRPC 的接口定义语言和序列化引擎。通过
.proto文件定义消息结构和服务接口,生成多语言代码。
下图展示了 gRPC 调用过程中这四个核心概念的协作关系:
1.4 gRPC 应用场景
gRPC 在以下场景中具有显著优势,已成为云原生生态中服务间通信的事实标准:
- 微服务内部通信:服务间需要高频、低延迟的调用,gRPC 的二进制序列化和 HTTP/2 多路复用能大幅降低延迟和带宽消耗。
- 实时流式处理:如日志收集、监控指标推送、股票行情推送等场景,gRPC 的双向流模式允许服务端和客户端持续交换数据。
- 移动端与后端通信:gRPC 的 protobuf 序列化体积小,节省移动端带宽和电量;配合 gRPC-Web 可支持浏览器端调用。
- IoT 设备通信:设备端资源受限,gRPC 的轻量级消息格式和流式传输非常适合物联网场景。
- 多语言异构系统集成:gRPC 原生支持 11+ 种编程语言,通过
.proto文件自动生成各语言代码,消除跨语言集成成本。
注意事项:gRPC 不适合浏览器直接调用(需 gRPC-Web 代理);对于简单的 CRUD 接口,REST 可能更直观;protobuf 的可读性不如 JSON,调试时需额外工具。
下图展示了 gRPC 在典型微服务架构中的位置:
1.5 本章小结
- gRPC 是基于 HTTP/2 和 protobuf 的高性能 RPC 框架,适合微服务内部通信。
- 与 REST 相比,gRPC 在性能、流式通信和代码生成方面有显著优势,但浏览器支持较弱。
- 核心概念包括 Service(服务定义)、Stub(客户端桩代码)、Channel(连接通道)和 Protocol Buffers(序列化契约)。
- 典型应用场景涵盖微服务、实时流处理、移动端、IoT 和多语言异构系统。