Golang http.Client请求程序遇到Connection Reset by peer 或 EOF 问题

问题

线上服务经常规律性的出现http.Client请求服务器数据和上报数据时报Connection Reset by peer 和 EOF 错误,在测试环境一直没有出现过;

原因

原因是线上环境是通过lvs-ngin代理转发,存在并发连接数限制,当达到限制时服务器会关闭其中一些连接; 同时客户端请求存在连接复用,如果在收到关闭之前复用了连接就会出现Connection Reset by peer; EOF错误发生在请求建立后读取时,此时服务器已经关闭连接,客户端还没有检测到关闭前读取数据;

解决方案

在请求时关闭连接复用,每次都使用新的连接;

1
2
req, err := NewRequest("POST", url, body)
req.Close = true

或者头部设置连接为关闭状态

1
2
req, err := NewRequest("POST", url, body)
req.Header.Add("Connection", "close")

使用 Transport 取消 HTTP利用连接 DisableKeepAlives 为true时,当前连接只会使用一次

1
2
3
tr := http.Transport{DisableKeepAlives: true}
client := http.Client{Transport: &tr}
client.Get(url)

参考