为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中测量反向代理响应时间

在 Go 中测量反向代理响应时间

Go
跃然一笑 2022-10-24 09:54:37
我有一个基于 http/net 的网络反向代理。我正在使用 NewSingleHostReverseProxy 函数。如何测量目标 Web 服务器的响应时间?
查看完整描述

1 回答

?
largeQ

TA贡献2039条经验 获得超8个赞

你可以做这样的事情。proxy.Transport用另一个实现来包装http.RoundtripperRoundTrip 响应所需的时间。


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


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(如下所示),您可以创建一个具有与相同参数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)


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号