登录
首页 >  Golang >  Go问答

Go 语言中关于 http2 的疑惑

来源:stackoverflow

时间:2024-03-14 15:27:26 143浏览 收藏

本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《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 调用的情况下,我以为我能够安全地进行它,但它却出错了。


解决方案


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

理论要掌握,实操不能落!以上关于《Go 语言中关于 http2 的疑惑》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>