文章

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.ClientTimeoutcontext.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 与你的可观测性/网络主题

连接点说明
EnvoygRPC 是 Envoy 原生支持的协议(L7 路由、重试、超时全支持),你 Envoy 与 Nginx 对比 的 L7 能力在此落地
OpenTelemetrygRPC 自动传播 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 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 打通
  • 实战注意