Archived
5.1 KiB
5.1 KiB
tags, create time
| tags | create time | |
|---|---|---|
|
2026-05-07 16:30 |
gRPC 知识索引
概述
本目录系统整理 gRPC 的核心知识点,从底层协议到生产实践,由浅入深覆盖 gRPC 的每一个关键领域。与 02-服务治理/05-服务间通信 中的入门对比不同,这里聚焦于「用了 gRPC 之后」—— 如何设计 Proto、如何编写拦截器、如何处理流式调用、连接怎么管、出错怎么查。
graph LR
A["01 协议与架构"] --> B["02 Proto设计"]
B --> C["03 RPC模式"]
C --> D["04 拦截器"]
D --> E["05 错误处理"]
E --> F["06 连接管理"]
F --> G["07 最佳实践"]
style A fill:#e3f2fd
style B fill:#fff3e0
style C fill:#c8e6c9
style D fill:#fce4ec
style E fill:#e8f5e9
style F fill:#f3e5f5
style G fill:#ffe0b2
知识体系
1. 01-协议与架构 — gRPC 的内部架构
从协议栈层次到 HTTP/2 多路复用原理,回答「为什么 gRPC 更快」。
| 核心内容 | 说明 |
|---|---|
| 协议栈分层 | Application → Generated Stub → gRPC Framework → HTTP/2 → TCP/IP |
| HTTP/2 三特性 | 多路复用、HPACK 头部压缩、二进制分帧 |
| 组件职责 | Channel、Stub、Transport、Picker 的作用域划分 |
[!tip] 理论基础篇 建议先读此篇,建立正确认知后再深入配置细节。
2. 02-Proto设计 — Proto 文件设计规范
如何写出经得起演进的 .proto 文件——这是最容易踩坑也最容易被忽视的部分。
| 核心内容 | 说明 |
|---|---|
| Oneof / Map / Well-Known Types | Proto3 进阶类型用法 |
| 版本管理 | 向前兼容三大铁律与决策速查表 |
| reserved 机制 | 锁定已删除字段编号的安全声明 |
| 命名约定 | package / service / message / field 统一规范 |
3. 03-RPC模式 — 四种 RPC 调用模式详解
| 模式 | 客户端消息数 | 服务端消息数 | 典型场景 |
|---|---|---|---|
| Unary(普通) | 1 | 1 | CRUD 常规操作 |
| Server Streaming | 1 | N | 列表查询、日志流拉取 |
| Client Streaming | N | 1 | 批量写入、大文件分块上传 |
| Bidi Streaming | N | M | 聊天室、实时协作、行情推送 |
[!question] 选型思考
实时订单状态推送:用双向流还是 WebSocket?gRPC 强类型契约 vs 浏览器原生支持的权衡在哪里?
4. 04-拦截器 — Interceptor 与上下文传播
gRPC 的切面编程能力:鉴权、日志、指标采集、重试决策都通过 interceptor 实现。
| 核心内容 | 说明 |
|---|---|
| 拦截器链架构 | 客户端链 vs 服务端链的执行顺序 |
| Go 链式封装 | chainUnaryInterceptors 解决多拦截器叠加问题 |
| Context Propagation | metadata 传递 trace ID、user ID 等上下文信息 |
| OpenTelemetry 集成 | W3C Trace Context 自动注入 |
5. 05-错误处理 — 状态码规范与客户端降级
| 核心内容 | 说明 |
|---|---|
| 16 个标准状态码 | 按 4xx / 5xx / 未实现分类的决策图 |
| status.Error vs fmt.Errorf | 为什么必须用 codes.* 做返回值 |
| Status Details | 带结构化详情的错误响应(BadRequest / RetryInfo) |
| 优雅降级 | 根据状态码选择重试、降级或直接报错 |
6. 06-连接管理 — Keepalive、负载均衡与服务发现
| 核心内容 | 说明 |
|---|---|
| Keepalive 策略 | ping 间隔、超时检测、MaxConnectionAge 平滑退役 |
| 负载均衡 Picker | pick_first / round_robin / weighted_round_robin 选型 |
| Name Resolver | DNS / K8s / Eureka 等服务发现后端接入 |
7. 07-最佳实践 — 生产部署 checklist
| 核心内容 | 说明 |
|---|---|
| 重试策略 | 指数退避 + 幂等性约束 + retryableStatusCodes 配置 |
| TLS / mTLS | 服务间信任基础,Istio Sidecar 透明加密 |
| Buf 工具链 | buf generate / buf.lock CI 集成 |
| 性能调优 | Window Size、gzip 取舍、QPS 万级压测要点 |
阅读路径
graph LR
Index["本文档<br/>(索引)"] --> Arch["01 协议与架构"]
Arch --> Proto["02 Proto设计"]
Proto --> RPCC["03 RPC模式"]
RPCC --> Intc["04 拦截器"]
Intc --> Err["05 错误处理"]
Err --> Conn["06 连接管理"]
Conn --> Prod["07 最佳实践"]
style Index fill:#fff9c4
style Arch fill:#e3f2fd
style Prod fill:#ffe0b2
关联笔记
- 02-服务治理/05-服务间通信 — gRPC 与 REST 的基础对比及混合通信模式
- 02-服务治理/04-服务发现 — Nacos / Consul / K8s Service 深度对比
- 02-服务治理/06-容错模式 — 重试、熔断、限流、降级的完整治理
- 02-服务治理/03-分布式追踪 — OpenTelemetry 链路追踪
- 02-服务治理/02-安全机制 — mTLS、JWT、RBAC