Go网络请求优化需复用连接、控制并发、设置超时、选合适协议:自定义http.Client调优Transport参数,用context设分级超时,限流防压垮,内部通信优先gRPC,避免JSON解析瓶颈。
在 Go 中优化网络请求,核心是减少阻塞、复用连接、合理控制并发,并避免常见反模式。Go 的 net/http 默认已较高效,但默认配置并不适合所有场景——尤其高并发、低延迟或大量外部调用的系统。
HTTP/1.1 默认支持长连接,但 Go 的 http.Client 不会自动复用连接,除非你显式配置 Transport。默认的 http.DefaultClient 使用的 Transport 对连接数限制较保守(如 MaxIdleConnsPerHost = 2),容易成为瓶颈。
建议自定义 http.Client 并调优 Transport:
MaxIdleConns 和 MaxIdleConnsPerHost(例如 100 或更高,视服务端承受力而定)IdleConnTimeout 控制空闲连接复用时长(推荐 30–90 秒)ForceAttemptHTTP2 = false
示例:
client := &http.Client{没有超时的请求会无限等待,拖垮 goroutine 和连接池。必须为每个请求设置明确的生命周期边界。
推荐使用 context.WithTimeout 或 context.WithDeadline,而非仅依赖 http.Client.Timeout(它只覆盖整个请求周期,不涵盖 DNS 解析、TLS 握手等前置阶段):
context.WithTimeout 统一兜底context.Background();优先从入参 context 派生子 context盲目开大量 goroutine 发请求,易触发文件描述符耗尽、TIME_WAIT 泛滥、或把下游打挂。需主动限流。
semaphore(如 golang.org/x/sync/semaphore)限制并发请求数MaxConnsPerHost 防止单点过载sony/gobreaker)+ 重试退避(backoff 库),避免雪崩简单并发控制示例:
sem := semaphore.NewWeighted(10) // 最多 10 并发HTTP 并非万能。若内部微服务通信,延迟敏感场景可考虑:
io.Copy)+ 边读边处理另外,JSON 解析(json.Unmarshal)较慢,高频场景可换 easyjson、ffjson 或 msgpack 等更高效的编解码器。