我已經實作了與 Gin 框架應用程式一起使用的 http 反向代理中間件:
app := gin.New()
app.Use(proxy.ReverseProxy("127.0.0.1:8008")) // HERE I'm attaching ReverseProxy middleware
在ReverseProxy方法中,我正在創建實體,httputil.ReverseProxy該實體取自變數transport期間已初始化的實體。init()
var transport *http.Transport
func init() { // HERE creating instance of Transport
transport = &http.Transport{
// some params
}
}
func ReverseProxy(targetServer string) gin.HandlerFunc {
return func(c *gin.Context) {
proxy := &httputil.ReverseProxy{
Transport: transport, // HERE reusing instance of Transport
// some params
}
proxy.ServeHTTP(c.Writer, c.Request)
}
}
所以問題:
擁有一個實體http.Transport并在其中重用它是否正確,httputil.ReverseProxy或者我必須根據每個請求創建新的傳輸?
func ReverseProxy(targetServer string) gin.HandlerFunc {
return func(c *gin.Context) {
// HERE creating instance of Transport
transport = &http.Transport{
// some params
}
proxy := &httputil.ReverseProxy{
Transport: transport, // HERE using NEW instance of Transport
// some params
}
proxy.ServeHTTP(c.Writer, c.Request)
}
}
哪種方式最好?
我目前重用傳輸因為我得到了性能提升,似乎它使用了已經創建的 tcp 連接。但是在高負載的情況下,我不確定它會如何行動,它會向不相關的客戶端回傳不相關的回應嗎?
鏈接到資源
uj5u.com熱心網友回復:
對于你的問題
擁有一個 http.Transport 實體并在 httputil.ReverseProxy 中重用它是否正確,或者我必須為每個請求創建新的傳輸?
創建一個代理并重新使用它可能是正確的方法。
您可以根據Transport檔案找到更多詳細資訊。
Transport 是 RoundTripper 的一個實作,它支持 HTTP、HTTPS 和 HTTP 代理(用于 HTTP 或帶 CONNECT 的 HTTPS)。
默認情況下,傳輸快取連接以供將來重用。當訪問許多主機時,這可能會留下許多打開的連接。可以使用 Transport 的 CloseIdleConnections 方法以及 MaxIdleConnsPerHost 和 DisableKeepAlives 欄位來管理此行為。
傳輸應該被重用而不是根據需要創建。傳輸對于多個 goroutines 的并發使用是安全的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/534428.html
