对 Go 的 http2 实现的困惑

  • 本文关键字:实现 http2 Go http go http2
  • 更新时间 :
  • 英文 :


我通过SSL运行大量流量。我想通过使用http2客户端来加快这些调用。然而,我很犹豫是否要这么做,因为感觉我对它的行为控制较少。

这是一个使用Go的基本网络http 的生产客户端

ClientHTTP := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
Dial: (&net.Dialer{
Timeout:   timeout * time.Second,
KeepAlive: 1 * time.Minute,
}).Dial,
TLSHandshakeTimeout: timeout * time.Second,
MaxIdleConns:        3000,
MaxIdleConnsPerHost: 3000,
IdleConnTimeout:     60 * time.Second,
},
Timeout: timeout * time.Second,
}

据我所知,我对交通的控制要少得多。

ClientHTTP2 := &http.Client{
Transport: &http2.Transport{
AllowHTTP: true,
},
Timeout: timeout * time.Second,
}

我缺什么了吗?http2生产准备好了吗?我知道http2使用单个TCP连接,因此像池这样的东西就消失了。然而,不知何故,它感觉不完整。这些行为会和生产客户端一样吗?有没有更好的方法来实现ClientHTTP2,最后,AllowHTTP似乎什么都不做。在可能有http调用的情况下,我以为我可以安全地调用它,但它却出错了。

http.Transport支持HTTP2,但您必须配置更现代的DialContext,而不是Dial(已弃用(:

package main
import (
"fmt"
"net"
"net/http"
"net/http/httputil"
"time"
)
func main() {
c := &http.Client{
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
DialContext: (&net.Dialer{ // use DialContext here
Timeout:   10 * time.Second,
KeepAlive: 1 * time.Minute,
}).DialContext,
TLSHandshakeTimeout: 10 * time.Second,
MaxIdleConns:        3000,
MaxIdleConnsPerHost: 3000,
IdleConnTimeout:     60 * time.Second,
},
Timeout: 1 * time.Second,
}
res, _ := c.Get("https://http2.akamai.com/")
b, _ := httputil.DumpResponse(res, false)
fmt.Println(string(b))
}
// HTTP/2.0 200 OK
// Content-Length: 11928
// Accept-Ch: DPR, Width, Viewport-Width, Downlink, Save-Data
// Access-Control-Allow-Credentials: false
// ...

使用http2.Transport的唯一原因是跳过最初的连接升级(即先验知识(。如果这不是一个问题,请坚持使用标准客户端和传输。

最新更新