第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 语言支持更广) |
| Dubbo | Java 生态 |
25.4 最后的话
从 MySQL → GORM → Gin → Redis → gRPC,你已经完成了 Go 后端全栈技术的学习。你学到的不仅是五个工具,更是一套完整的后端架构思维:
数据库(MySQL) → ORM(GORM) → Web框架(Gin) → 缓存(Redis) → RPC(gRPC)这五样组合起来,就是构建一个现代微服务系统的完整工具链。
祝你在后端工程师的道路上越走越远!