golang,go,博客,开源,编程
go-cleanhttp 是一个专门为 Golang 开发者设计的工具库,旨在提供一组函数,用以生成配置“干净”的 HTTP 客户端(http.Client)和传输(http.Transport)。在 Golang 中,标准库自带的 http.DefaultClient
和 http.DefaultTransport
往往存在共享状态(如连接池)的隐患,尤其在并发或多库同时使用时可能出现意外的副作用。
而 go-cleanhttp 则致力于消除这些隐患,帮助开发者创建独立且配置合理的 HTTP 请求组件。
废话不多说,上代码
package main
import (
"fmt"
"io/ioutil"
"net/http"
"github.com/hashicorp/go-cleanhttp" // 假设库的引入路径为该路径
)
func main() {
// 使用库函数创建一个干净的 HTTP 客户端
client := cleanhttp.DefaultClient()
// 发送一个 GET 请求
resp, err := client.Get("https://www.example.com")
if err != nil {
fmt.Println("请求失败:", err)
return
}
defer resp.Body.Close()
// 读取并输出响应内容
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("读取响应失败:", err)
return
}
fmt.Println("响应内容:", string(body))
}
在这个示例中,cleanhttp.DefaultClient()
返回的客户端不会和 http.DefaultClient
共享状态,这就避免了在高并发场景下可能出现的隐患。
设置超时
import (
"github.com/hashicorp/go-cleanhttp"
"time"
)
client := cleanhttp.NewClient()
client.SetTimeout(10 * time.Second)
用法完全与net/http相同。
首先看下transport的配置
func DefaultPooledTransport() *http.Transport {
transport := &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
DualStack: true,
}).DialContext,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
ForceAttemptHTTP2: true,
MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1,
}
return transport
}
使用transport的地方
func DefaultTransport() *http.Transport {
transport := DefaultPooledTransport()
transport.DisableKeepAlives = true
transport.MaxIdleConnsPerHost = -1
return transport
}
注意这里的值,DisableKeepAlives = true ,MaxIdleConnsPerHost
= -1。就是想去掉共享、避免复用。
go-cleanhttp ,看完源码,你会发现它是真的clean。
hashicorp用它来做什么呢?