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()
	}
posted @ 2025-05-22 16:34  rm-rf*  阅读(30)  评论(0)    收藏  举报