1. Timeout 的区别
1.1 http.Client.Timeout
- 作用:
Timeout
定义了整个 HTTP 请求的最长时间,包含以下所有步骤的总和:- DNS 解析
- 建立 TCP 连接(包括
DialTimeout
) - TLS 握手(如果是 HTTPS)
- 发送请求
- 读取响应头和响应体
- 自动重定向(如果启用)的耗时
- 触发条件: 如果整个过程的累计时间超过
Timeout
,请求会被强制取消,并返回net/http: request canceled (Client.Timeout exceeded)
错误。
1.2 DialTimeout
- 作用:
DialTimeout
是net.Dialer
的一个字段,专门控制建立 TCP 连接的最长等待时间。如果在此时间内未完成连接,会返回超时错误。 - 触发条件: TCP 连接建立过程耗时超过
DialTimeout
(如网络不通、服务端未监听端口等场景)。 - 配置位置: 通过自定义
http.Transport
设置,再赋值给http.Client.Transport
:
1 | transport := &http.Transport{ |
1.3 总结
在大多数情况下,设置 http.Client.Timeout
就足够了,它可以有效地防止整个请求过程的无限期等待。
当你需要更精细地控制连接建立过程,例如:
- 网络环境不稳定,连接建立容易失败: 设置一个较短的
DialTimeout
可以让连接快速失败,避免长时间等待无效的连接尝试。 - 需要快速失败机制: 对于某些关键业务请求,希望在连接建立阶段就快速检测到问题并失败,可以使用
DialTimeout
。 - 性能优化: 在某些高并发场景下,优化连接建立时间可以提高整体性能。