go如何正确地关闭http连接及其区别


go的http客户端建立连接后,完成请求不再复用时,应该将连接关闭掉

有几种方式可以关闭连接,应用的地方也有所不同:

一. 主动关闭 CloseIdleConnections

     client := http.Client{}
     defer client.CloseIdleConnections()   //关闭连接

该方法调用后,客户端主动关闭空闲连接,客户端所在系统tcp连接进入time_wait状态,客户端向外连接其他服务的端口是受到端口范围65535(或者更少)限制的,过多的time_wait会导致客户端向外建立连接失败。

二.被动关闭连接

    if req, err = http.NewRequestWithContext(context.Background(), http.MethodPost, conf.HttpUrl, bodyReader); err == nil {
     req.Header.Add("Connection", "close")  //关闭连接  
     ……

req.Header.Add("Connection", "close") ,这个应该比较容易明白,在http头增加Connection属性值,这是http协议的一个约定,服务器收到后,处理完http请求会主动关闭连接,客户端tcp连接被动关闭,服务器tcp连接进入time_wait状态

三.被动关闭连接

    if req, err = http.NewRequestWithContext(context.Background(), http.MethodPost, conf.HttpUrl, bodyReader); err == nil {
       req.Close = true    //关闭连接
     ……

对于Close,它的官方注释说的比较清楚:"Close 表示是在响应此请求后(对于服务器)关闭连接,还是在发送此请求并读取其响应后(对于客户端)关闭连接"。所以 当设置 req.Close = true 时,实际上go的做法,也是使用http头增加"Connection close"通知服务器, 服务器在响应客户端http请求后,主动关闭连接。



有任何问题或建议请Email:donnie4w@gmail.comhttps://tlnet.top/contact  发信给我,谢谢!