对Go的http2实现的困惑

时间:2018-07-31 01:58:37

标签: http go http2

我通过SSL运行大量流量。我当时正在考虑使用http2客户端加快这些调用的速度。但是,我很犹豫,因为感觉好像我对它的行为没有更多的控制。

这里是使用Go的基本net / 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调用的情况下,我认为我可以安全地启用它,但会出错。

1 个答案:

答案 0 :(得分:4)

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的唯一原因是跳过初始连接升级(又称为先验知识)。如果这不是问题,请坚持使用标准客户并进行运输。