猿问

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

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



跃然一笑
浏览 187回答 1
1回答

largeQ

你可以做这样的事情。proxy.Transport用另一个实现来包装http.RoundtripperRoundTrip 响应所需的时间。我认为这通常会向您显示“响应时间”。不是“请求时间”,因为仍然可以从响应中读取正文,因此请求可能仍在进行中,但这应该大致显示服务器响应请求所需的时间。package mainimport (    "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)
随时随地看视频慕课网APP

相关分类

Go
我要回答