调用第三方 api 时构建具备重试机制的 http 客户端可提升稳定性。1. 控制重试次数,一般设为 2~3 次;2. 设置合理间隔时间,建议使用指数退避策略;3. 区分可重试与不可重试错误,如网络超时、连接失败和 5xx 错误可重试,4xx 和 tls 握手失败通常不重试;4. 使用自定义 roundtripper 实现重试逻辑,在每次请求失败后判断错误类型并决定是否重试;5. 结合 context.context 控制超时,记录日志以便排查问题;6. 封装成通用组件便于复用,提供默认配置同时支持自定义参数。通过这些策略,能有效增强程序的健壮性。

调用第三方 API 时出错是常态,特别是在网络不稳定、服务端偶发异常的情况下。Golang 中构建一个具备重试机制的 HTTP 客户端,能有效提升程序的健壮性和稳定性。重点在于控制重试次数、设置合理的间隔时间,并区分可重试与不可重试的错误。

不是所有错误都适合重试。比如:
i/o timeout
connection refused
500 Internal Server Error
400 Bad Request
404 Not Found
在实现中,需要根据这些错误类型来决定是否继续重试。例如通过检查
error
立即学习“go语言免费学习笔记(深入)”;

http.Client
Go 的标准库允许我们自定义
RoundTripper
一个简单的思路是:

示例结构如下:
type RetryingRoundTripper struct {
base http.RoundTripper
retries int
waitTime time.Duration
}
func (rt *RetryingRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) {
var resp *http.Response
var err error
for i := 0; i <= rt.retries; i++ {
resp, err = rt.base.RoundTrip(req)
if err == nil {
// 请求成功
return resp, nil
}
// 判断是否属于可重试错误
if isRetryableError(err) {
time.Sleep(rt.waitTime)
continue
}
// 不可重试,直接返回错误
return nil, err
}
return nil, fmt.Errorf("request failed after %d retries", rt.retries)
}其中
isRetryableError()
重试不是越多越好,策略设置要合理:
你可以结合
context.Context
time.AfterFunc
为了在多个项目中复用这个逻辑,可以封装成一个构造函数,提供默认参数,同时支持自定义配置。例如:
func NewRetryingClient(retries int, waitTime time.Duration) *http.Client {
return &http.Client{
Transport: &RetryingRoundTripper{
base: http.DefaultTransport,
retries: retries,
waitTime: waitTime,
},
Timeout: 10 * time.Second,
}
}这样在调用第三方 API 时,只需传入你配置好的 client 即可。
基本上就这些。写得简单点,就是一个带重试的 RoundTripper 加上一些策略判断。不复杂但容易忽略细节,比如错误判断、上下文控制、日志输出等,这些才是真正影响稳定性的关键点。
以上就是Golang第三方API调用错误处理 构建可重试的HTTP客户端方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号