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.com或 https://tlnet.top/contact 发信给我,谢谢!