Zuul在长期请求中超时

时间:2015-03-06 17:26:40

标签: spring-cloud netflix-zuul

我正在使用作为zuul代理(@EnableZuulProxy)的前端spring spring应用程序(微服务)将来自外部源的请求路由到使用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前锋的超时,所以我可以从我的直接关注中消除这个问题。有什么可访问的参数设置。

我正处于发布阶段,这只是出现了:)

8 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:30)

在我的情况下,我必须更改以下属性:

zuul.host.socket-timeout-millis=30000

答案 2 :(得分:20)

我遇到了同样的问题:在长时间的请求中,尽管设置了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

答案 3 :(得分:13)

我不得不改变两次超时以迫使zuul停止超时长时间请求。即使禁用了hystrix超时,功能区仍然会超时。

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

答案 4 :(得分:10)

这对我有用,我必须在application.yml

中设置连接和套接字超时
zuul:
  host:
    connect-timeout-millis: 60000 # starting the connection 
    socket-timeout-millis: 60000  # monitor the continuous incoming data flow

答案 5 :(得分:3)

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

如果您通过指定网址配置了Zuul路线,则需要使用zuul.host.connect-timeout-milliszuul.host.socket-timeout-millis

通过路线我是指

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

答案 6 :(得分:1)

我遇到了类似的问题,我试图全局设置超时,还设置了 Hystrix Ribbon 问题的设置超时顺序。

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

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

Hystrix 时间应大于 Ribbon ReadTimeout和ConnectionTimeout的总时间。

使用仅用于特定服务,这意味着请不要全局设置(这是行不通的)。

我的意思是用这个:

#!/bin/bash

shopt -s nullglob

for file in "$dir"/*.ym; do
  if [[ ! -f "${file%.*}.job" ]]; then
    echo "$file"
  fi
done

代替此:

command:
   your-service-name:

工作解决方案:

command:
   default:

Reference

答案 7 :(得分:0)

只有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

希望它有所帮助!