代码之家  ›  专栏  ›  技术社区  ›  num8er

重用与创建http的新实例。httputil中的传输。反向代理

  •  0
  • num8er  · 技术社区  · 2 年前

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

    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。反向代理 或者我必须根据每个请求创建新的传输?

    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

    1 回复  |  直到 2 年前
        1
  •  3
  •   zangw    2 年前

    对于您的问题

    有一个http实例正确吗。在httputil中传输并重用它。ReverseProxy还是我必须在每次请求时创建新的传输?

    创建一个代理并重用它可能是正确的方法。

    您可以根据找到更多详细信息 Transport 文档

    Transport是RoundTripper的一种实现,支持HTTP、HTTPS和HTTP代理(用于HTTP或HTTPS with CONNECT)。

    默认情况下,传输缓存连接以备将来重用。这可能会在访问许多主机时留下许多打开的连接。可以使用Transport的CloseIdleConnections方法以及MaxIdleConnsPerHost和DisableKeepAlives字段来管理此行为。

    传输应该重复使用,而不是根据需要创建。传输对于多个goroutine并发使用是安全的。