【问题标题】:Zuul timing out in long-ish requestsZuul 在长请求中超时
【发布时间】:2015-05-08 09:07:48
【问题描述】:

我正在使用前端 Spring Cloud 应用程序(微服务)作为 Zuul 代理 (@EnableZuulProxy) 将来自外部源的请求路由到使用 Spring Cloud (Spring Boot) 编写的其他内部微服务。
Zuul 服务器直接来自示例部分中的应用程序

@SpringBootApplication
@Controller
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulServerApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ZuulServerApplication.class).web(true).run(args);
    }
}

我在本地运行了这组服务,一切似乎都运行良好,但如果我在有一定负载的网络上或通过 VPN 运行它,那么我开始看到 Zuul 转发错误,我将其视为客户端超时在日志中。

有什么方法可以更改 Zuul 转发的超时时间,以便我可以从我的直接关注中消除这个问题?有哪些可访问的参数设置?

【问题讨论】:

    标签: spring-cloud netflix-zuul


    【解决方案1】:

    就我而言,我必须更改以下属性:

    zuul.host.socket-timeout-millis=30000
    

    【讨论】:

    • 这是不使用功能区时的解决方案
    • 是否可以为每个主机应用此解决方案以避免将其应用于所有端点?
    【解决方案2】:

    要设置的属性是:ribbon.ReadTimeout(一般)和<service>.ribbon.ReadTimeout(用于特定服务),以毫秒为单位。 Ribbon wiki 有一些例子。 This javadoc 具有属性名称。

    【讨论】:

    • 感谢您的帮助。我在哪里可以找到所有这些参数的默认设置?
    • 这些是配置:com.netflix.client.config.DefaultClientConfigImpl?
    • 如果我不使用它,是否可以不仅为功能区设置此属性?
    【解决方案3】:

    我遇到过同样的问题:在长请求中,尽管设置了ribbon.ReadTimeout=10000,但 Zuul 的 hystrix 命令在大约一秒后仍然超时。

    我通过完全禁用超时来解决它:

    hystrix:
      command:
        default:
          execution:
            timeout:
              enabled: false
    

    另一种可行的方法是将 Zuul 的 Hystrix 隔离策略更改为 THREAD:

    hystrix:
      command:
        default:
          execution:
            isolation:
              strategy: THREAD
              thread:
                timeoutInMilliseconds: 10000
    

    【讨论】:

    • 非常非常非常感谢:-) 最后一个对我有用!它有一些缺点吗?哦,我的上帝.. 没有超时了.. 谢谢
    • 我不确定,但我认为没有问题。实际上,到目前为止,我们已经在生产中使用没有问题。你可以在这里阅读更多关于为什么 SEMAPHORE 是默认实现的信息。 stackoverflow.com/questions/29965817/…
    • 要将此隔离到特定服务:# 禁用单个服务的 Hystrix 超时:hystrix.command.<serviceName>.execution.timeout.enabled: false # 将 Hystrix 超时增加到 60 秒(每个服务)hystrix.command.<serviceName>.execution.isolation.thread.timeoutInMilliseconds: 60000
    【解决方案4】:

    这对我有用,我必须在 application.yml 中设置连接和套接字超时:

    zuul:
      host:
        connect-timeout-millis: 60000 # starting the connection 
        socket-timeout-millis: 60000  # monitor the continuous incoming data flow
    

    【讨论】:

      【解决方案5】:

      我不得不更改两个超时来强制 zuul 停止对长时间运行的请求进行超时。即使禁用 hystrix 超时,功能区仍然会超时。

      hystrix:
        command:
          default:
            execution:
              timeout:
                enabled: false
      ribbon:
        ReadTimeout: 100000
        ConnectTimeout: 100000 
      

      【讨论】:

      • 谢谢你,我上次登录stackoverflow是在2016年,我不得不登录说谢谢和upvote
      【解决方案6】:

      如果 Zuul 使用服务发现,则需要使用 ribbon.ReadTimeoutribbon.SocketTimeout Ribbon 属性配置这些超时。

      如果你已经通过指定URL配置了Zuul路由,则需要使用zuul.host.connect-timeout-milliszuul.host.socket-timeout-millis

      我的意思是路线

      zuul:
        routes:
          dummy-service:
            path: /dummy/**
      

      【讨论】:

        【解决方案7】:

        我遇到了类似的问题,我试图在全局范围内设置 timeout,并且为 HystrixRibbon 设置超时的顺序也很重要。

        花了很多时间后,我最终得到了这个解决方案。由于数据量巨大,我的服务最多需要 50 秒。

        在更改超时默认值之前需要考虑的几点:

        Hystrix 时间应该大于 Ribbon ReadTimeout 和 ConnectionTimeout 的组合时间。

        仅用于特定服务,这意味着不要全局设置(这不起作用)。

        我的意思是使用这个:

        command:
           your-service-name:
        

        而不是这个:

        command:
           default:
        

        工作解决方案:

        hystrix:
         command:
           your-service-name:
          execution:
            isolation:
              strategy: THREAD
              thread:
                timeoutInMilliseconds: 95000
        
        your-service-name:
         ribbon:
          ConnectTimeout: 30000
          ReadTimeout: 60000
          MaxTotalHttpConnections: 500
          MaxConnectionsPerHost: 100
        

        Reference

        【讨论】:

        • 特定服务路径的超时怎么办?
        【解决方案8】:

        只有application.yml 上的这些设置对我有用:

        ribbon:
            ReadTimeout: 90000
            ConnectTimeout: 90000
        
        eureka:
            enabled: true
        
        zuul:
            host:
                max-total-connections: 1000
                max-per-route-connections: 100
            semaphore:
                max-semaphores: 500
        
        hystrix:
            command:
                default:
                    execution:
                        isolation:
                            thread:
                                timeoutInMilliseconds: 1000000
        

        希望它对某人有所帮助!

        【讨论】:

          猜你喜欢
          • 2018-01-09
          • 2012-09-29
          • 2021-10-13
          • 2011-02-26
          • 2017-10-31
          • 2011-04-19
          • 2014-03-11
          • 2013-07-01
          • 1970-01-01
          相关资源
          最近更新 更多