1. 简介
在Go中使用http.Transport可以方便地进行HTTP长连接的管理与控制。http.Transport提供了丰富的配置选项,比如连接池大小、超时时间、TLS配置等等,以便应对复杂的网络环境。
2. http.Transport的基本使用
2.1 创建http.Transport
使用http.Transport时,需要先创建一个Transport对象。
import "net/http"
tr := &http.Transport{}
在默认情况下,Transport会创建一个连接池,线程安全地管理TCP连接。连接的重用策略是:每个host会保持最多2个永久连接,如果已有2个连接,新的请求会被阻塞,直到某个连接被释放。
2.2 发送http请求
创建http.Client对象后,可以使用它来发送http请求。Transport会自动管理http连接的生命周期,确保连接的复用和释放。
client := &http.Client{Transport: tr}
req, _ := http.NewRequest(http.MethodGet, "https://www.example.com", nil)
resp, _ := client.Do(req)
// 处理resp...
3. 高级功能
3.1 连接池大小
默认情况下,Transport创建的每个连接池最多保留2个永久连接。可以通过MaxIdleConnsPerHost字段来调整每个host的连接池大小。
tr := &http.Transport{
MaxIdleConnsPerHost: 10,
}
在这个例子中,每个host的连接池最多保留10个永久连接。
3.2 连接超时
默认情况下,Transport会等待连接建立的时间是没有上限的。如果需要设置连接超时,需要使用DialContext函数,并在其中创建连接。
import "net"
tr := &http.Transport{
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
conn, err := net.DialTimeout(network, addr, time.Second)
if err != nil {
return nil, err
}
conn.SetDeadline(time.Now().Add(10 * time.Second))
return conn, nil
},
}
在这个例子中,DialContext函数创建连接时,设置了超时时间和连接的读写超时时间。这样可以确保连接在一定时间内建立,并且在一定时间内读写数据。
3.3 TLS配置
默认情况下,Transport会对https请求进行TLS加密。可以使用TLSClientConfig字段来配置TLS。
import "crypto/tls"
tr := &http.Transport{
TLSClientConfig: &tls.Config{},
}
在这个例子中,使用默认的TLS配置。也可以通过配置RootCAs、Certificates、CipherSuites等字段来定制TLS配置。
3.4 代理
有时候需要在请求时使用代理。可以使用Proxy字段来配置代理。
import "net/http/httputil"
proxyURL, _ := url.Parse("http://proxy.example.com:8888")
proxy := httputil.NewSingleHostReverseProxy(proxyURL)
tr := &http.Transport{
Proxy: func(req *http.Request) (*url.URL, error) {
return proxyURL, nil
},
}
在这个例子中,使用httputil.NewSingleHostReverseProxy创建一个代理对象,然后在Proxy字段中返回这个代理对象。这样就可以使用这个代理对象代理请求。
4. 总结
http.Transport提供了丰富的配置选项,可以方便地进行HTTP长连接的管理与控制。可以通过配置连接池大小、连接超时、TLS配置、代理等字段,来应对复杂的网络环境。