← 返回题目列表

gRPC 的原理和特点是什么?

高频 中等 第 6 / 25 题 更新于 2026/07/28
RPCgRPCHTTP2Protobuf

简化版

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 支持四种调用模式,远比传统「一问一答」丰富:

  1. 一元 RPC(Unary):客户端发一个请求,服务端返回一个响应。这是最普通的调用(等同传统 RPC)。
  2. 服务端流(Server Streaming):客户端发一个请求,服务端返回一个响应流(多个消息)。适合服务端持续推送、大结果分批返回(如订阅行情、下载大数据)。
  3. 客户端流(Client Streaming):客户端发一个请求流(多个消息),服务端返回一个响应。适合批量上传、数据聚合
  4. 双向流(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 定契约压体积、四种流模式、云原生首选