gRPC 的原理和特点是什么?
简化版
gRPC 是 Google 开源的高性能、跨语言 RPC 框架,两大基石是 HTTP/2 传输协议 和 Protobuf 序列化。你用 .proto 文件定义服务接口和消息结构(IDL),用工具生成各语言的客户端和服务端代码,然后像调本地方法一样调用。它的核心优势:基于 HTTP/2(多路复用、双向流、头部压缩、长连接)性能高;用 Protobuf 二进制序列化体积小速度快;天然跨语言(一份 proto 生成多语言代码);支持四种调用模式(一元、服务端流、客户端流、双向流)。是云原生(Kubernetes 生态)微服务通信的主流选择。
详细版
gRPC 的核心特点:
| 特点 | 说明 |
|---|---|
| 基于 HTTP/2 | 多路复用、双向流、头部压缩、长连接,性能高 |
| Protobuf 序列化 | 二进制、体积小、性能高、强类型 |
| IDL 定义(.proto) | 用 proto 文件定义服务和消息,生成多语言代码 |
| 跨语言 | 支持 Java/Go/Python/C++/Node 等主流语言 |
| 四种流模式 | 一元、服务端流、客户端流、双向流 |
四种调用模式:
- 一元(Unary):一个请求 → 一个响应(普通调用)。
- 服务端流(Server Streaming):一个请求 → 多个响应流(如推送、大结果分批)。
- 客户端流(Client Streaming):多个请求流 → 一个响应(如上传)。
- 双向流(Bidirectional Streaming):请求响应都是流(如聊天、实时通信)。
.proto 示例:
service UserService {
rpc GetUser (UserRequest) returns (UserReply);
}
message UserRequest { int32 id = 1; }
message UserReply { string name = 1; }
完整版教学
一、gRPC 是什么
gRPC 是 Google 开源的现代 RPC 框架,名字里的 g 有多种说法(gRPC Remote Procedure Calls)。它的设计目标是高性能、跨语言、适合云原生。它建立在两个坚实的基础上:HTTP/2 作为传输协议 和 Protobuf 作为接口定义与序列化。它是 CNCF(云原生计算基金会)生态、Kubernetes 内部通信的主流 RPC 方案。
二、基石一:基于 HTTP/2
gRPC 用 HTTP/2 作为底层传输协议,这带来相比 HTTP/1.1 的巨大提升:
- 多路复用(Multiplexing):一个 TCP 连接上可以并发传输多个请求/响应流,互不阻塞。而 HTTP/1.1 一个连接同一时刻只能处理一个请求(队头阻塞)。多路复用大幅提升了连接利用率和吞吐。
- 双向流(Streaming):HTTP/2 支持流式传输,使得 gRPC 能实现客户端流、服务端流、双向流等模式(见下文),不局限于「一问一答」。
- 头部压缩(HPACK):压缩 HTTP 头部,减少冗余传输。
- 长连接、二进制分帧:连接复用、二进制帧传输,效率高。
正是 HTTP/2 让 gRPC 兼具「高性能」和「流式通信」能力。
三、基石二:Protobuf 序列化 + IDL
gRPC 用 Protobuf 作为接口定义语言(IDL)和序列化协议:
- 你在
.proto文件里定义服务(有哪些 rpc 方法)和消息结构(请求/响应的字段)。 - 用 protoc 编译器 + gRPC 插件,从这份
.proto生成各种语言的客户端桩(Stub)和服务端骨架代码。 - 运行时,请求/响应用 Protobuf 二进制序列化——体积小、性能高、强类型、向前向后兼容好。
这套 IDL 驱动的方式的好处:一份 .proto 定义,生成多语言代码,天然实现跨语言,且接口是强类型的、契约清晰。
四、四种调用模式(流式是亮点)
得益于 HTTP/2 的流特性,gRPC 支持四种调用模式,远比传统「一问一答」丰富:
- 一元 RPC(Unary):客户端发一个请求,服务端返回一个响应。这是最普通的调用(等同传统 RPC)。
- 服务端流(Server Streaming):客户端发一个请求,服务端返回一个响应流(多个消息)。适合服务端持续推送、大结果分批返回(如订阅行情、下载大数据)。
- 客户端流(Client Streaming):客户端发一个请求流(多个消息),服务端返回一个响应。适合批量上传、数据聚合。
- 双向流(Bidirectional Streaming):客户端和服务端都用流,可以同时收发。适合实时双向通信(如聊天、实时协作、语音)。
流式能力是 gRPC 相比很多传统 RPC 框架的一大亮点。
五、gRPC 的优缺点与适用场景
优点:
- 高性能:HTTP/2 多路复用 + Protobuf 二进制,性能优秀。
- 跨语言:官方支持众多语言,一份 proto 走天下。
- 流式通信:四种模式,尤其双向流适合实时场景。
- 强类型契约:proto 定义清晰,接口即文档,兼容性好。
- 云原生标配:K8s、Istio、etcd 等大量使用。
缺点/权衡:
- 可读性差:二进制格式,不像 JSON 能直接看懂,调试要工具(grpcurl 等)。
- 浏览器支持有限:浏览器不能直接调 gRPC(需 gRPC-Web 代理)。
- 有一定学习成本:要写 proto、生成代码。
适用:内部微服务间高性能通信、跨语言服务调用、需要流式/实时的场景、云原生基础设施。
六、常见误区与追问
这道题面试时最容易丢分的地方,是把「gRPC 原理」答成一段泛泛的组件介绍。更稳的答法是先给结论,再沿着 远程调用链路 拆清楚流程,最后补上异常场景、数字边界和选型取舍。
| 回答层次 | 要讲清的内容 | 容易漏掉的边界 |
|---|---|---|
| 核心定义 | gRPC 基于 HTTP/2 和 Protobuf,通过 IDL 生成客户端和服务端代码,支持一元调用和流式调用 | 不要停在名词解释 |
| 流程机制 | 编写 proto 文件 -> 生成多语言 Stub -> 客户端调用 Stub -> Protobuf 编码消息 -> HTTP/2 传输 -> 服务端解码并执行方法 | 说明谁触发、谁存储、谁通知、谁兜底 |
| 工程取舍 | HTTP/2 多路复用能在同一连接上并发多个 RPC,Protobuf 让请求体比文本 JSON 更紧凑 | RPC 让调用写法像本地方法,但失败语义、网络延迟和版本兼容必须按远程系统处理 |
gRPC 原理 面试拆解:
1. 编写 proto 文件
2. 生成多语言 Stub
3. 客户端调用 Stub
4. Protobuf 编码消息
5. HTTP/2 传输
6. 服务端解码并执行方法
记忆钩子:先拆代理、序列化、传输、寻址、容错,再说明超时、重试、幂等这些工程边界;回答时一定要落到题目中的「gRPC 原理」,不要把相邻中间件的能力混着讲。
- 误区:gRPC 就是普通 HTTP 接口。 它是 RPC 框架,使用 HTTP/2 作为传输层,并依赖 Protobuf 契约。
- 误区:Protobuf 文件只是文档。 proto 是接口契约,会生成强类型客户端和服务端代码。
- 误区:gRPC 只支持请求响应。 它支持一元、服务端流、客户端流和双向流。
- 追问:HTTP/2 给 gRPC 带来什么? 多路复用、头部压缩、流控制和长连接能力。
- 追问:gRPC 适合浏览器直接调用吗? 浏览器原生支持有限,通常需要 gRPC-Web 或网关转换。
- 追问:如何做接口演进? 新增字段保留旧字段编号,不随意复用 tag,保持向前向后兼容。
七、加强记忆
gRPC = Google 开源的高性能跨语言 RPC 框架,两大基石:HTTP/2(多路复用并发多流不阻塞、双向流、头部压缩、长连接 → 高性能 + 流式能力)+ Protobuf(IDL 定义 + 二进制序列化,体积小性能高强类型跨语言兼容好)。用 .proto 定义服务和消息 → 生成多语言代码,实现跨语言。四种调用模式:一元(一问一答)、服务端流(推送/分批)、客户端流(上传/聚合)、双向流(实时通信)。优点:高性能、跨语言、流式、强类型契约、云原生标配;缺点:二进制不易读调试、浏览器需 gRPC-Web。口诀:HTTP/2 提性能给流、Protobuf 定契约压体积、四种流模式、云原生首选。