--- tags: [grpc] create time: 2026-05-07 16:30 --- # gRPC 知识索引 ## 概述 本目录系统整理 **gRPC** 的核心知识点,从底层协议到生产实践,由浅入深覆盖 gRPC 的每一个关键领域。与 [[02-服务治理/05-服务间通信]] 中的入门对比不同,这里聚焦于「用了 gRPC 之后」—— 如何设计 Proto、如何编写拦截器、如何处理流式调用、连接怎么管、出错怎么查。 ```mermaid 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 万级压测要点 | ## 阅读路径 ```mermaid graph LR Index["本文档
(索引)"] --> 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 ``` - **推荐路径**:按编号顺序逐篇阅读,每篇独立成篇也可跳读 - **快速上手**:直接读 [[03-RPC模式]] 和 [[07-最佳实践]],掌握核心用法后按需补其他篇 - **遇到问题时**:优先定位到对应子篇,不必通读全文 ## 关联笔记 - [[02-服务治理/05-服务间通信]] — gRPC 与 REST 的基础对比及混合通信模式 - [[02-服务治理/04-服务发现]] — Nacos / Consul / K8s Service 深度对比 - [[02-服务治理/06-容错模式]] — 重试、熔断、限流、降级的完整治理 - [[02-服务治理/03-分布式追踪]] — OpenTelemetry 链路追踪 - [[02-服务治理/02-安全机制]] — mTLS、JWT、RBAC