go的net/http,tcp连接复用问题踩坑
如果没有读body,直接关闭body,那么连接不会复用,以下代码为错误示例
resp, err := http.Get(`http://www.example.com`)
if err != nil {
panic(err)
}
defer resp.Body.Close()
即使不需要知道body的内容,如果为了复用这个连接,应该把body读完io.Copy(io.Discard, resp.Body),但是请注意:如果服务器响应很慢/数据包很大,坚持读完body又会浪费大量时间,不如下次请求时新建连接
for i := 0; i < 20; i++ {
req, _ := http.NewRequest("GET", "http://127.0.0.1:8080", nil)
trace := &httptrace.ClientTrace{
GotConn: func(info httptrace.GotConnInfo) {
fmt.Printf(
"[%d] 复用: %v, 本地端口: %v\n",
i,
info.Reused,
info.Conn.LocalAddr(),
)
},
}
req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
resp, _ := http.DefaultClient.Do(req)
io.Copy(io.Discard, resp.Body)
resp.Body.Close()
}
你要是觉得写的还不错,就点个关注,可以评论区留下足迹,以后方便查看.
你要是觉得写的很辣鸡,评论区欢迎来对线!
欢迎转载!

浙公网安备 33010602011771号