Go语言 在httputil.ReverseProxy中重用与创建http.Transport的新示例

w9apscun  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(340)

我已经实现了与Gin框架应用程序一起使用的http反向代理中间件:

app := gin.New()
app.Use(proxy.ReverseProxy("127.0.0.1:8008"))  // HERE I'm attaching ReverseProxy middleware

ReverseProxy方法中,我正在创建httputil.ReverseProxy的示例,该示例从已经在init()变量期间初始化的transport中获取。

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连接。但在高负载的情况下,我不知道它将如何行动,它会返回无关的响应无关的客户端?
Link to sources

2vuwiymt

2vuwiymt1#

对于您的问题
拥有一个http.Transport示例并在httputil.ReverseProxy中重用它是否正确,或者我必须为每个请求创建新传输?
创建一个代理并重用它可能是正确的方法。
您可以在运输文档中找到更多详细信息。
传输是支持HTTP、HTTPS和HTTP代理(对于使用CONNECT的HTTP或HTTPS)的RoundTripper实现。
默认情况下,传输缓存连接以供将来重用。这可能会在访问多个主机时留下多个打开的连接。可以使用传输的CloseIdleConnections方法以及MaxIdleConnsPerHost和DisableKeepAlives字段来管理此行为。
传输应该被重用,而不是按需创建。传输对于多个goroutine的并发使用是安全的。

相关问题