为了账号安全,请及时绑定邮箱和手机立即绑定

在 httputil.ReverseProxy 中重用与创建 http.Transport 的新实例

在 httputil.ReverseProxy 中重用与创建 http.Transport 的新实例

Go
拉丁的传说 2023-03-15 14:35:51
我已经实现了与 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.Transportfunc 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 连接。但是在高负载的情况下,我不确定它会如何行动,它会向不相关的客户端返回不相关的响应吗?
查看完整描述

1 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

对于你的问题

拥有一个 http.Transport 实例并在 httputil.ReverseProxy 中重用它是否正确,或者我必须为每个请求创建新的传输?

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

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

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

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

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


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信