golang HTTP请求中的超时
我们首先来看一下HTTP请求过程中,可能产生的不同的超时类型:
- TCP连接超时
- HTTP请求头超时
- HTTP Body读超时
- HTTP Body写超时
- Keepalive超时
目前的HTTP库大多数都是支持HTTP/1.1(HTTP/2由于存在连接并发复用,需要考虑的维度就不同了),在此情况下,HTTP库将用户的请求分为了两个层面,一个是连接层面,一个是请求层面;对于采用keep-alive机制的客户端,当请求结束之后,不一定断开连接,HTTP库会维护与服务端的连接;有同一个服务端的请求发起时,可以再次使用之前的连接。
HTTP库基本超时设置
HTTP在创建client时可以再client结构中设置一个超时时间:
client := &http.Client{
CheckRedirect: redirectPolicyFunc,
Timeout: time.Second * 5
}
resp, err := client.Get("https://www.google.com/")
如果只设置这个client.Timeout
,用不久就会发现这个超时时间管的太宽了。其覆盖了请求的全部过程,从连接建立一直到获得请求结果。入上例所示,如果client.Get
没有在5秒钟内返回结果,就会返回request timeout
的err。<