Go 语言 http.Client 连接池踩坑:为什么你的 Keep-Alive 没生效?
用 Go 写后端服务时,调用外部 HTTP 接口几乎是家常便饭。为了复用 TCP 连接、降低延迟,大家都会依赖 http.Client 默认开启的 Keep-Alive 机制。但实际压测或上线后,有时会发现连接数暴涨、TIME_WAIT 堆积,甚至被下游服务限流——明明用的是同一个 client 实例,连接却完全没复用。问题通常出在响应体没有正确关闭、Transport 被意外替换、或者读完了 body 却忘了 io.Copy(io.Discard, resp.Body)。这篇文章从一次线上连接泄漏的排查过程出发,拆解 Go 标准库中连接复用的几个前提条件,给出可直接落地的封装方式和监控指标,...