golang,go,博客,开源,编程

golang每日一库之go-cleanhttp

Updated on with 0 views and 0 comments

一、库简介

go-cleanhttp 是一个专门为 Golang 开发者设计的工具库,旨在提供一组函数,用以生成配置“干净”的 HTTP 客户端(http.Client)和传输(http.Transport)。在 Golang 中,标准库自带的 http.DefaultClienthttp.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用它来做什么呢?


标题:golang每日一库之go-cleanhttp
作者:mooncakeee
地址:http://blog.dd95828.com/articles/2025/04/16/1744764379332.html
联系:scotttu@163.com