【发布时间】:2022-01-01 16:27:31
【问题描述】:
我有一个基于 http/net 的网络反向代理。我正在使用 NewSingleHostReverseProxy 函数。如何测量目标 Web 服务器的响应时间?
【问题讨论】:
标签: go
我有一个基于 http/net 的网络反向代理。我正在使用 NewSingleHostReverseProxy 函数。如何测量目标 Web 服务器的响应时间?
【问题讨论】:
标签: go
你可以做这样的事情。将 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)
【讨论】: