0%

golang的http库

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

  • 作用: DialTimeoutnet.Dialer 的一个字段,专门控制建立 TCP 连接的最长等待时间。如果在此时间内未完成连接,会返回超时错误。
  • 触发条件: TCP 连接建立过程耗时超过 DialTimeout(如网络不通、服务端未监听端口等场景)。
  • 配置位置: 通过自定义 http.Transport 设置,再赋值给 http.Client.Transport
1
2
3
4
5
6
7
8
9
10
transport := &http.Transport{
DialContext: (&net.Dialer{
Timeout: 5 * time.Second, // TCP 连接超时 5
KeepAlive: 30 * time.Second,
}).DialContext,
}
client := &http.Client{
Transport: transport,
Timeout: 15 * time.Second, // 总超时高于 DialTimeout 更合理
}

1.3 总结

在大多数情况下,设置 http.Client.Timeout 就足够了,它可以有效地防止整个请求过程的无限期等待。

当你需要更精细地控制连接建立过程,例如:

  • 网络环境不稳定,连接建立容易失败: 设置一个较短的 DialTimeout 可以让连接快速失败,避免长时间等待无效的连接尝试。
  • 需要快速失败机制: 对于某些关键业务请求,希望在连接建立阶段就快速检测到问题并失败,可以使用 DialTimeout
  • 性能优化: 在某些高并发场景下,优化连接建立时间可以提高整体性能。
可以加首页作者微信,咨询相关问题!