------Don’t use Go’s default HTTP client (in production)
https://medium.com/@nate510/don-t-use-go-s-default-http-client-https://blog.csdn.net/benben_2015/article/details/84886088
最近环境出现了一个报错“net/http: request canceled (Client.Timeout exceeded while awaiting headers”,追踪发现是我们代码中在请求时使用的是http.DefaultClient,这俩面并没有设置超时,而导致request cancel,而且我之前对 Transport中的几种超时也不是特别理解,趁今天整理下
1.首先client结构中有一个Timeout,如图,这个 timeout使用比较简单,它涵盖整个交互过程,从发起连接到接收响应报文结束
2.而Transport中的超时能让你更精确的控制超时
· net.Dialer.Timeout 限制创建一个TCP连接使用的时间(如果需要一个新的链接)
· http.Transport.TLSHandshakeTimeout 限制TLS握手使用的时间
· http.Transport.ResponseHeaderTimeout 限制读取响应报文头使用的时间
· http.Transport.ExpectContinueTimeout 限制客户端在发送一个包含:100-continue的http报文头后,等待收到一个go-ahead响应报文所用的时间。在1.6中,此设置对HTTP/2无效。(在1.6.2中提供了一个特定的封装DefaultTransport)
· http.Transport.IdleConnTimeout:连接最大空闲时间,超过这个时间就会被关闭
· http.Transport.ExpectContinueTimeout: 等待服务器的第一个响应headers的时间,0表示没有超时,则body会立刻发送,无需等待服务器批准,这个时间不包括发送请求header的时间
其他参数解释:
DisableKeepAlives:true为代表开启长连接
MaxIdleConns: 是长连接在关闭之前,连接池对所有host的最大链接数量
MaxIdleConnsPerHost: 连接池对每个host的最大链接数量(MaxIdleConnsPerHost <= MaxIdleConns,如果客户端只需要访问一个host,那么最好将MaxIdleConnsPerHost与MaxIdleConns设置为相同,这样逻辑更加清晰)