账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    golang proxy timeout的问题
    158
    0

    需求:
    golang实现proxy来做到前端请求某个url后落到proxy上,proxy再发起请求到backend server, 然后为了性能问题, 我需要考虑超时后放弃后端返回,以及提醒http client超时(504)

    我的思路:

    target, err := url.Parse(backend)  
    if err != nil {  
       fmt.Printf("backend %s parse errr : %v\n", backend, err)  
    }  
      
    reserveProxy := httputil.NewSingleHostReverseProxy(target)  
    reserveProxy.Transport = Transport{cfg}  
    c.Request.Host = target.Host  
    c.Request.URL.Path = newReqpath  
      
    reserveProxy.ServeHTTP(c.Writer, c.Request)
    proxyTransport := http.Transport{  
       Proxy:                  http.ProxyFromEnvironment,  
       DialContext: (&net.Dialer{  
          Timeout:   3 * time.Second,  
          KeepAlive: 30 * time.Second,  
          Deadline: time.Now().Add(3 * time.Second),  
       }).DialContext,  
      
       ForceAttemptHTTP2:     true,  
       MaxIdleConns:          100,  
       IdleConnTimeout:       90 * time.Second,  
       TLSHandshakeTimeout:   10 * time.Second,  
       ExpectContinueTimeout: 1 * time.Second,  
    }  
    return proxyTransport.RoundTrip(r)

    我试图使用golang自带的reserveproxy来做proxy,并且利用transporttimeout,但是整个请求完全没有超时的作用(模拟一个接口20s,整个proxy就20s返回给http client)

    寻找思路:
    github issue
    stackoverflow

    发现有人和我遇到同样的问题,但是没有解决

    所以这是不是golang的一个bug,还是我的使用不当?

    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 尼杰呫 普通会员 1楼

      在Go语言中,可以通过在代理服务器上设置超时时间来解决代理服务器过慢的问题。这可以通过在代理服务器的配置文件中设置超时时间来实现。

      以下是一个简单的例子:

      ```go package main

      import ( "net" "time" )

      func main() { proxyServer := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello from proxy server!")) }), }

      for {
          proxyServer.ListenAndServe()
      }
      

      } ```

      在这个例子中,代理服务器监听8080端口,处理HTTP请求。当代理服务器过慢时,它将在每1秒检查一次是否已经超时。如果已经超时,代理服务器将返回一个4xx错误,从而阻止HTTP请求到达目标服务器。

      请注意,这只是一个基本的例子。在实际应用中,你可能需要处理更多的情况,例如代理服务器的故障、代理服务器的超时时间设置等。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部