沙滩星空的博客沙滩星空的博客

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

Go标准库高并发HTTP请求出现EOF错误

线上服务经常规律性的出现http.Client请求服务器数据和上报数据时报Connection Reset by peer 和 EOF 错误,

原因

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

解决方法有三:

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

    req, err := NewRequest("POST", url, body)
    req.Close = true
  • 头部设置连接为关闭状态

    req, err := NewRequest("POST", url, body)
    req.Header.Add("Connection", "close")
  • 使用 Transport 取消 HTTP利用连接 DisableKeepAlives 为true时,当前连接只会使用一次

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

[Go] Golang http.Client请求程序遇到 Connection Reset by Peer 或 EOF 问题
https://piaohua.github.io/post/golang/20200814-golang-connection-reset-by-peer/
未经允许不得转载:沙滩星空的博客 » Golang http.Client请求程序遇到 Connection Reset by Peer 或 EOF 问题

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址