在 Go 中创建一个 http client 时,一般会使用 Go http 包的 Transport 类型。本文主要说明 http.Transport 需要关注的主要参数。http.Transport 类型说明http.Transport 主要参数DefaultTransport 配置DialContext 简单示例Referencehttp.Transport 类型说明首先我们要明确的是,我们开发 http client 的时候,经常会这么写:client := &http.Client{
Transport: http.DefaultTransport,
}但细看可以发现,http.Client 的 Transport 成员类型是 http.RoundTripper,而不是 http.Transport 类型。换句话说,开发者完全可以抛弃原生的实现,自己定制一份 http.RoundTripper 接口来实现一个完整的 http 调用。不过这不在本文说明范围内。http.Transport 主要参数该类型通过一系列的参数来决定其行为。请注意的是,同样数据类型的不同参数,其表达的默认值是不同的。参数作用默认值连接控制类Proxy指定使用 http 代理。这里推荐传入 http.ProxyFromEnvironment, 以支持系统配置的 http 代理nil,表示 不使用 任何代理,请注意DialContextTCP 连接函数。开发者可以简单封装一下,一般可以用来做一些监控或者特殊的地址解析逻辑nil, 使用默认的 http 连接超时控制类TLSHandShakeTimeouttime.Duration 类型,表示TLS 握手超时时间。这里推荐传入一个非零值0, 表示无限制IdleConnTimeouttime.Duration 类型,表示一个连接在空闲多久之后关闭。0, 表示不关闭连接数控制类MaxIdleConns最大空闲连接数0, 表示无限制MaxIdleConnsPerHost每一个 host 的最大连接数http.DefaultMaxIdleConnsPerHost,即 2缓冲区类WriteBufferSize写缓冲区的大小4kBReadBufferSize读缓冲区的大小4kB其他ForceAttemptHTTP2字面意思,是否强制尝试 HTTP2。建议设置为 truefalse, 不尝试DefaultTransport 配置http.DefaultTransport 是基于 http.Transport 实现的,其配置说明如下:参数值Proxyhttp.ProxyFromEnvironment 即 follow 系统配置DialContextnet.Dialer 类型的 DialContext 方法TLSHandShakeTimeout10 秒IdleConnTimeout90 秒MaxIdleConns100MaxIdleConnsPerHosthttp.DefaultMaxIdleConnsPerHost,即 2WriteBufferSize4kBReadBufferSize4kBForceAttemptHTTP2trueDialContext 简单示例func dialContext(ctx context.Context, network, addr string) (net.Conn, error) {
// 注: 这里无视了 ctx 的超时, 实际上应该加上
log.Debugf("request connecting %v, %v", network, addr)
tcpAddr, err := net.ResolveTCPAddr(network, addr)
if err != nil {
return nil, fmt.Errorf("resolve %s failed: %w", addr, err)
}
conn, err := net.DialTCP(network, nil, tcpAddr)
if err != nil {
return nil, fmt.Errorf("connect to %v failed: %w", tcpAddr, err)
}
return conn, nil
}Reference官方文档Golang TCP server and Client ExampleCreate a TCP anf UDP Client and Server using Go本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。原作者: amc,原文发布于云+社区,也是本人的博客。欢迎转载,但请注明出处。原作者: amc,欢迎转载,但请注明出处。原文标题:《Go http.Transport 主要参数说明》
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。