Skip to content

第25章:gRPC 面试宝典与总复习 ​

25.1 知识体系回顾 ​

gRPC 知识体系
├── RPC 概念
│   ├── 远程过程调用(像调用本地函数)
│   ├── RPC 三要素:IDL + 序列化 + 传输
│   └── RPC vs REST
├── Protocol Buffers(proto3)
│   ├── 基本类型 / Message / Enum / oneof / Any
│   ├── Service 定义(四种模式)
│   ├── 字段编号(不可改!)
│   └── 向后兼容原则
├── 四种通信模式
│   ├── 一元(Request→Response)
│   ├── 服务端流(stream Response)
│   ├── 客户端流(stream Request)
│   └── 双向流(stream + stream)
├── 高级特性
│   ├── 状态码(16种标准错误码)
│   ├── Deadline/Timeout(Context传播)
│   ├── 拦截器(Server/Client/Unary/Stream)
│   ├── Metadata(Header传递)
│   └── 认证(JWT/TLS/mTLS)
├── 生产实践
│   ├── 健康检查(grpc_health_v1)
│   ├── Reflection(动态发现)
│   ├── 负载均衡(Client-side LB)
│   ├── gRPC Gateway(REST转gRPC)
│   ├── 服务发现(Consul/Etcd)
│   └── 测试(bufconn)
└── 生态工具
    ├── buf(规范检查+代码生成)
    ├── grpcurl/grpcui(调试)
    └── ghz(压测)

25.2 高频面试题 30 题 ​

基础 ​

Q1:gRPC 和 REST 的区别?

①通信模型:gRPC 面向服务/方法,REST 面向资源;②数据格式:Protobuf(二进制) vs JSON(文本);③协议:HTTP/2 vs HTTP/1.1;④Schema:.proto 强类型 vs 弱约束。

Q2:Protobuf 为什么比 JSON 快?

①二进制编码,字段用编号代替名字,体积小 3-5 倍;②预编译 Schema,序列化/反序列化快 5-10 倍;③整数用 Varint 变长编码省空间。

Q3:proto3 字段编号有什么用?

序列化时不存字段名只存编号,编号是二进制兼容的基础。永不改编号 = 永不破坏兼容性。

Q4:proto3 的默认值陷阱?

所有字段有默认值(int=0, string="", bool=false),序列化时默认值被省略,导致无法区分"没传"和"传了默认值"。

流式 ​

Q5:四种通信模式及应用场景?

一元=普通查询;服务端流=大数据推送;客户端流=批量上传;双向流=实时聊天。

Q6:流式 RPC 和 WebSocket 的区别?

gRPC 流基于 HTTP/2 多路复用(单连接多流),Protobuf 序列化,强类型;WebSocket 基于 HTTP/1.1 升级,文本/二进制帧,无 Schema。

底层 ​

Q7:gRPC 为什么基于 HTTP/2?

HTTP/2 的多路复用(单连接多并发流)、头部压缩(HPACK)、双向流、Server Push。HTTP/1.1 每次请求一个连接或串行。

Q8:gRPC 拦截器和 Gin 中间件的异同?

同:都是洋葱模型、Next/Abort 模式。异:gRPC 分 Unary 和 Stream 两套拦截器,签名不同。

实践 ​

Q9:gRPC 怎么做负载均衡?

Client-side LB:通过 Name Resolver 获取服务列表 + Round Robin/一致性哈希策略选择节点。不需要额外的 LB 代理。

Q10:gRPC Gateway 是什么?

一个反向代理,把 REST JSON 请求转换为 gRPC Protobuf 请求。对外暴露 REST,内部用 gRPC。

Q11:如何保证 gRPC 调用的安全性?

传输层:TLS/mTLS 加密;应用层:JWT + 拦截器;Metadata 传递认证信息。

Q12:gRPC 的超时是怎么传播的?

Client 设 context.WithTimeout → deadline 写入 HTTP/2 HEADERS 帧 → Server 从 ctx 读到 deadline → 继续传给下游。全链路自动传播剩余时间。


25.3 选型指南 ​

框架适用
gRPC微服务间通信(高性能+流式+强类型)
REST/JSON对外开放 API、浏览器直接调用
Thrift多语言(比 gRPC 语言支持更广)
DubboJava 生态

25.4 最后的话 ​

从 MySQL → GORM → Gin → Redis → gRPC,你已经完成了 Go 后端全栈技术的学习。你学到的不仅是五个工具,更是一套完整的后端架构思维:

数据库(MySQL) → ORM(GORM) → Web框架(Gin) → 缓存(Redis) → RPC(gRPC)

这五样组合起来,就是构建一个现代微服务系统的完整工具链。

祝你在后端工程师的道路上越走越远!

把零散知识,整理成可以反复走的路。