2026-05-11 19:02:38 +08:00
|
|
|
|
---
|
|
|
|
|
|
tags: [gRPC, Protobuf, Go, RPC, Microservice]
|
|
|
|
|
|
create time: 2026-05-11 15:30
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
# gRPC & Protobuf 知识库
|
|
|
|
|
|
|
|
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
gRPC 是 Google 开源的高性能 RPC 框架,基于 HTTP/2 和 Protobuf 序列化,是现代微服务通信的事实标准。本知识库从 Protobuf 消息定义入手,贯穿服务端、客户端、流式通信、中间件链到生产级工程实践。
|
|
|
|
|
|
|
|
|
|
|
|
> [!question] gRPC vs REST?什么时候选 gRPC?
|
|
|
|
|
|
> gRPC 适合内部服务间通信:强类型契约(Protobuf)、低延迟、双向流;REST 更适合对外 API:人类可读、浏览器原生支持、缓存友好。二者并非互斥——常见的做法是用 API Gateway 将 REST 转为 gRPC。
|
|
|
|
|
|
|
|
|
|
|
|
## 目录索引
|
|
|
|
|
|
|
|
|
|
|
|
### 1. Protobuf 基础篇
|
|
|
|
|
|
|
|
|
|
|
|
- **[01-Protobuf 语法与消息定义](./1. Protobuf 基础篇/01-Protobuf 语法与消息定义.md)** — `.proto` 文件结构、message / enum / oneof / map 字段、package 与 import
|
|
|
|
|
|
- **[02-数据类型详解](./1. Protobuf 基础篇/02-数据类型详解.md)** — Scalar Types、Wrapper Types、Well-Known Types、Repeated 与 Packaged 语义
|
|
|
|
|
|
- **[03-字段编号与前向兼容](./1. Protobuf 基础篇/03-字段编号与前向兼容.md)** — Field Number 分配规则、Reserved、版本演进策略、向后/向前兼容原理
|
|
|
|
|
|
- **[04-Oneof 与包装类型](./1. Protobuf 基础篇/04-Oneof 与包装类型.md)** — Oneof 排他选择、GoogleProtobuf.Value 万能类型、Any 泛型封装
|
|
|
|
|
|
|
|
|
|
|
|
### 2. gRPC 核心篇
|
|
|
|
|
|
|
|
|
|
|
|
- **[05-RPC 调用模式总览](./2. gRPC 核心篇/05-RPC 调用模式总览.md)** — Unary、Server Streaming、Client Streaming、Bidirectional Streaming 四种模式对比
|
|
|
|
|
|
- **[06-Service 定义与代码生成](./2. gRPC 核心篇/06-Service 定义与代码生成.md)** — `.proto` Service/Dialect 语法、protoc 插件体系、Go Stub 生成机制
|
|
|
|
|
|
- **[07-HTTP2 传输原理](./2. gRPC 核心篇/07-HTTP2 传输原理.md)** — HTTP/2 Frame、Stream Multiplexing、Header Compression(HPACK)、Flow Control
|
2026-05-13 11:17:21 +08:00
|
|
|
|
- **↳ [07-RPC 设计与 RESTful 对应](./2. gRPC 核心篇/07-HTTP2 传输原理/07-RPC 设计与 RESTful 对应.md)** — PUT/PATCH/POST 语义映射、Partial Update 的 PATCH + FieldMask 方案
|
2026-05-11 19:02:38 +08:00
|
|
|
|
|
|
|
|
|
|
### 3. 服务端实现
|
|
|
|
|
|
|
|
|
|
|
|
- **[08-Server 搭建与注册](./3. 服务端实现/08-Server 搭建与注册.md)** — grpc.NewServer、服务注册、多端口监听、Reflection
|
|
|
|
|
|
- **[09-Streaming Handler](./3. 服务端实现/09-Streaming Handler.md)** — Send / Recv 循环模式、Context 超时处理、优雅关闭流程
|
|
|
|
|
|
- **[10-健康检查与反射](./3. 服务端实现/10-健康检查与反射.md)** — Health Check v1 API、ServerReflection、调试接入
|
|
|
|
|
|
|
|
|
|
|
|
### 4. 客户端开发
|
|
|
|
|
|
|
|
|
|
|
|
- **[11-Client 连接与 Dial](./4. 客户端开发/11-Client 连接与 Dial.md)** — grpc.Dial / WithInsecure / TransportCredentials、Dial Options 精选
|
|
|
|
|
|
- **[12-Call Options 与 Context](./4. 客户端开发/12-Call Options 与 Context.md)** — WithTimeout / WithMeta / Retry Policy、Context 取消传播
|
|
|
|
|
|
- **[13-Streaming Client](./4. 客户端开发/13-Streaming Client.md)** — 三种 Stream 的 Client 端遍历模式、recv 错误分类
|
|
|
|
|
|
|
|
|
|
|
|
### 5. 中间件与拦截器
|
|
|
|
|
|
|
|
|
|
|
|
- **[14-Unary 与 Stream 拦截器](./5. 中间件与拦截器/14-Unary 与 Stream 拦截器.md)** — Chain 链构建、interceptor.Handler 签名、上下文传递
|
|
|
|
|
|
- **[15-元数据与鉴权](./5. 中间件与拦截器/15-元数据与鉴权.md)** — MD 读取/注入、Token 校验、TLS mTLS、per-RPC Credentials
|
|
|
|
|
|
- **[16-日志与链路追踪](./5. 中间件与拦截器/16-日志与链路追踪.md)** — 请求耗时统计、Trace ID 透传、OpenTelemetry 集成
|
|
|
|
|
|
|
|
|
|
|
|
### 6. 工程实践篇
|
|
|
|
|
|
|
|
|
|
|
|
- **[17-protoc 工具链与 Makefile](./6. 工程实践篇/17-protoc 工具链与 Makefile.md)** — protoc-gen-go / protoc-gen-go-grpc 版本匹配、go generate、多语言生成
|
|
|
|
|
|
- **[18-模块拆分与 proto 规范](./6. 工程实践篇/18-模块拆分与 proto 规范.md)** — proto 目录结构、命名约定、import 路径规范、linter 集成
|
|
|
|
|
|
- **[19-跨语言兼容测试](./6. 工程实践篇/19-跨语言兼容测试.md)** — Go ↔ Java ↔ Node 互通、默认值差异、枚举一致性
|
|
|
|
|
|
- **[20-性能优化与压测](./6. 工程实践篇/20-性能优化与压测.md)** — 序列化大小调优、连接池复用、Compression、gRPC-Bench 压测手法
|
|
|
|
|
|
|
|
|
|
|
|
## 核心架构
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
graph TB
|
|
|
|
|
|
subgraph "应用层"
|
|
|
|
|
|
A["Handler 业务逻辑"]
|
|
|
|
|
|
B["Interceptor Chain"]
|
|
|
|
|
|
C["Metadata / Auth / Trace"]
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
subgraph "gRPC 层"
|
|
|
|
|
|
D["Server / Client"]
|
|
|
|
|
|
E["Stream Controller"]
|
|
|
|
|
|
F["Call Options"]
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
subgraph "传输层"
|
|
|
|
|
|
G["HTTP/2 Framing"]
|
|
|
|
|
|
H["HPACK Header"]
|
|
|
|
|
|
I["Flow Control"]
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
subgraph "数据层"
|
|
|
|
|
|
J["Protobuf Serialize"]
|
|
|
|
|
|
K["Message Definition"]
|
|
|
|
|
|
L["Enum / Oneof / Map"]
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
A --> B --> D --> G --> J
|
|
|
|
|
|
B --> C
|
|
|
|
|
|
D --> E --> F
|
|
|
|
|
|
J --> K --> L
|
|
|
|
|
|
|
|
|
|
|
|
style A fill:#00B6BC,color:#fff
|
|
|
|
|
|
style D fill:#4FC08D,color:#fff
|
|
|
|
|
|
style G fill:#FF6B35,color:#fff
|
|
|
|
|
|
style J fill:#A0AEC0,color:#fff
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 学习路径建议
|
|
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
|
flowchart LR
|
|
|
|
|
|
P1["Protobuf 语法"] --> P2["gRPC 核心概念"]
|
|
|
|
|
|
P2 --> P3["服务端开发"]
|
|
|
|
|
|
P2 --> P4["客户端开发"]
|
|
|
|
|
|
P3 --> P5["中间件与拦截器"]
|
|
|
|
|
|
P4 --> P5
|
|
|
|
|
|
P5 --> P6["工程实践"]
|
|
|
|
|
|
P5 --> P7["性能优化"]
|
|
|
|
|
|
|
|
|
|
|
|
style P1 fill:#00D866,color:#fff
|
|
|
|
|
|
style P6 fill:#FF9F43,color:#000
|
|
|
|
|
|
style P7 fill:#EE5A24,color:#fff
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 关联笔记
|