hashicorp/go-retryablehttp

GitHub: hashicorp/go-retryablehttp

一个对 Go 标准 net/http 库的轻量封装,为 HTTP 请求提供自动重试和指数退避能力。

Stars: 2340 | Forks: 293

# go-retryablehttp [![Build Status](http://img.shields.io/travis/hashicorp/go-retryablehttp.svg?style=flat-square)][travis] [![Go Documentation](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)][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分析, 日志审计