hashicorp/go-retryablehttp
GitHub: hashicorp/go-retryablehttp
一个对 Go 标准 net/http 库的轻量封装,为 HTTP 请求提供自动重试和指数退避能力。
Stars: 2340 | Forks: 293
# go-retryablehttp
[][travis]
[][godocs]
`retryablehttp` 包提供了一个熟悉的 HTTP 客户端接口,支持自动重试和指数退避。它是对标准的 `net/http` 客户端库的一个轻量级封装,并暴露了几乎相同的公共 API。这使得 `retryablehttp` 非常容易直接引入到现有程序中。
`retryablehttp` 会在特定条件下执行自动重试。主要情况包括:客户端返回错误(如连接错误等),或者收到 500 范围(除 501 外)的响应状态码时,会在等待一段时间后触发重试。否则,将直接返回响应,交由调用者自行解释处理。
与 `net/http` 的主要区别在于,对于带有请求体(如 POST/PUT 等)的请求,可以通过多种方式(效率各有不同)来提供请求体,以便在初始请求失败时能够“回退(rewind)”请求体,从而完整地重新尝试该请求。有关更多详细信息,请参阅 [godoc](http://godoc.org/github.com/hashicorp/go-retryablehttp)。
0.6.0 及更早版本兼容 1.12 之前的 Go。从 0.6.1 版本开始,需要 Go 1.12+。
从 0.6.7 版本开始,需要 Go 1.13+。
# 使用示例
使用该库的方式应与您使用 `net/http` 几乎完全一致。下面展示了最简单的 GET 请求示例:
```
resp, err := retryablehttp.Get("/foo")
if err != nil {
panic(err)
}
```
返回的响应对象是 `*http.Response`,与您通常从 `net/http` 获取的对象相同。如果请求失败了一次或多次,上述调用将会阻塞,并在进行指数退避后重试。
## 获取支持重试的标准库 `*http.Client`
可以直接将 `*retryablehttp.Client` 转换为 `*http.Client`。这使得 retryablehttp 能够以极小的代价广泛应用。只需根据需要配置好 `*retryablehttp.Client`,然后调用 `StandardClient()` 即可:
```
retryClient := retryablehttp.NewClient()
retryClient.RetryMax = 10
standardClient := retryClient.StandardClient() // *http.Client
```
有关更多用法和示例,请访问 [pkg.go.dev](https://pkg.go.dev/github.com/hashicorp/go-retryablehttp)。
标签:EVTX分析, 日志审计