【问题标题】:Measuring reverse proxy response times in Go在 Go 中测量反向代理响应时间
【发布时间】:2022-01-01 16:27:31
【问题描述】:

我有一个基于 http/net 的网络反向代理。我正在使用 NewSingleHostReverseProxy 函数。如何测量目标 Web 服务器的响应时间?

【问题讨论】:

    标签: go


    【解决方案1】:

    你可以做这样的事情。将 proxy.Transport 与另一个 http.Roundtripper 实现包装在一起,计算 RoundTrip 响应所需的时间。

    我认为这通常会向您显示“响应时间”。不是“请求时间”,因为仍然可以从响应中读取正文,因此请求可能仍在进行中,但这应该会大致显示服务器响应请求所需的时间。

    package main
    
    import (
        "fmt"
        "net/http"
        "net/http/httputil"
        "net/url"
        "time"
    )
    
    func main() {
        url, _ := url.Parse("https://stackoverflow.com")
        proxy := httputil.NewSingleHostReverseProxy(url)
        proxy.Transport = NewTimingRoundtripper(http.DefaultTransport)
    }
    
    type TimingRoundtripper struct {
        transport http.RoundTripper
    }
    
    func NewTimingRoundtripper(transport http.RoundTripper) http.RoundTripper {
        return TimingRoundtripper{transport: transport}
    }
    
    func (rt TimingRoundtripper) RoundTrip(r *http.Request) (resp *http.Response, err error) {
        start := time.Now()
        resp, err = rt.transport.RoundTrip(r)
        fmt.Println("request", r.URL, time.Since(start))
        return resp, err
    }
    

    如果您想传递自定义 *tls.Config(如下所示),您可以使用 same parameters 作为 http.DefaultTransport 创建一个新传输,但使用自定义 *tls.Config

        var myTransport http.RoundTripper = &http.Transport{
            Proxy: http.ProxyFromEnvironment,
            DialContext: (&net.Dialer{
                Timeout:   30 * time.Second,
                KeepAlive: 30 * time.Second,
            }).DialContext,
            ForceAttemptHTTP2:     true,
            MaxIdleConns:          100,
            IdleConnTimeout:       90 * time.Second,
            TLSHandshakeTimeout:   10 * time.Second,
            ExpectContinueTimeout: 1 * time.Second,
            TLSClientConfig:       &tls.Config{InsecureSkipVerify: true},
        }
    

    然后像这样初始化:

    proxy.Transport = NewTimingRoundtripper(myTransport)
    

    【讨论】:

    • 谢谢!这个对我有用。但是如何在此解决方案中使用 tls.Config{InsecureSkipVerify: true} 选项?
    • @SadicanÜstün 添加了有关上述内容的详细信息
    猜你喜欢
    • 1970-01-01
    • 2016-03-02
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2016-07-10
    相关资源
    最近更新 更多