Go 网络与 gRPC
Go 网络与 gRPC
一句话:Go 的标准库
net/http是”工业级”的——它内置连接复用、超时控制、中间件链,是多数 Go 服务的底座。gRPC则在其上用 HTTP/2 + Protobuf 提供强类型 RPC。本文和你network主题(HTTP/WebSocket、Envoy)直接咬合。
net/http 内幕(关键机制)
srv := &http.Server{
Addr: ":8080",
ReadTimeout: 5 * time.Second, // 读请求体超时
WriteTimeout: 10 * time.Second, // 写响应超时
IdleTimeout: 120 * time.Second, // keep-alive 空闲超时
}
| 机制 | 说明 |
|---|---|
| ServeMux | 路由多路复用(Go 1.22+ 支持方法+路径通配) |
| 连接复用 | 默认 HTTP/1.1 keep-alive;Transport 池化连接 |
| 超时三件套 | Read/Write/Idle Timeout——不设就会”连接挂死” |
| 中间件 | func(http.Handler) http.Handler 链式包裹 |
这正是你
HTTP 与 WebSocket 连接模型与超时里”首包卡死”的 Go 侧解法:http.Client的Timeout或context.WithTimeout必须设——否则http.Do在”等响应头”这一步无限阻塞。Go 的服务端ReadHeaderTimeout同理。
用 context 贯穿超时(请求级取消)
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := client.Do(req) // ctx 到期自动中断
NewRequestWithContext让整个请求(含连接、读响应)受 ctx 约束- 下游调用链全部接同一 ctx → 一处超时全链路取消(见
Go 并发模型深入)
gRPC:强类型 RPC
service Order {
rpc Create(CreateReq) returns (CreateResp);
rpc Stream(stream Msg) returns (stream Msg); // 双向流
}
| 特性 | 说明 |
|---|---|
| HTTP/2 | 多路复用、单连接并发多请求(比 HTTP/1.1 省连接) |
| Protobuf | 二进制、强 schema、体积小、序列化快 |
| 四种模式 | Unary(请求-响应)、Server Streaming、Client Streaming、Bidirectional |
| 拦截器 | 中间件(auth、log、metric、trace 注入) |
| 状态码 | gRPC 自有状态(OK/CANCELLED/DEADLINE_EXCEEDED) |
conn, _ := grpc.Dial(addr, grpc.WithInsecure()) // 生产用 WithTransportCredentials(TLS)
client := pb.NewOrderClient(conn)
resp, err := client.Create(ctx, &pb.CreateReq{...})
gRPC 的
DEADLINE_EXCEEDED就是 context 超时的 RPC 表达——和上面 HTTP 超时同源。
gRPC 与你的可观测性/网络主题
| 连接点 | 说明 |
|---|---|
| Envoy | gRPC 是 Envoy 原生支持的协议(L7 路由、重试、超时全支持),你 Envoy 与 Nginx 对比 的 L7 能力在此落地 |
| OpenTelemetry | gRPC 自动传播 trace context(W3C),和 分布式追踪 OpenTelemetry 咬合 |
| MCP | 你的 MCP 笔记(1 篇)里 MCP 的 Streamable HTTP / 传输层,Go SDK 常用 gRPC 或 HTTP |
| 服务网格 | Istio/Cilium 对 gRPC 做 mTLS、流量切分、熔断——缺失主题但与此强相关 |
实战注意
| 坑 | 解法 |
|---|---|
| gRPC 消息过大 | 默认 4MB,调 MaxReceiveMessageSize |
| 负载均衡 | L4(IP)轮询会破坏 HTTP/2 连接复用,需用 L7(Envoy/代理)或 gRPC 客户端侧 LB |
| 超时传播 | 每跳必须透传 ctx deadline,否则下游不知上游已超时 |
| TLS | 生产必开 mTLS,尤其服务网格内 |
关联知识
- Go 并发模型深入 — context 超时贯穿
- HTTP 与 WebSocket 连接模型与超时 — 首包卡死的 Go 侧解法
- Envoy 与 Nginx 对比 — gRPC 的 L7 治理能力
- 分布式追踪 OpenTelemetry — gRPC trace 传播
- MCP — MCP 传输层与 Go 实现
- Go 基础速查 — 入门
参考资源
- Go
net/http文档 - gRPC Go 快速开始:grpc.io/docs/languages/go/
学习时间
| 内容 | 日期 | 状态 | |------|------| | Go 网络与 gRPC | 2026-07-24 | 完成:net/http 机制、context 超时、gRPC 四模式、与可观测性/网络主题打通 |
状态
- net/http 内幕
- context 超时
- gRPC 四模式
- 与 Envoy/OTel/MCP 打通
- 实战注意