Zuul在长请求中超时

52

我正在使用一个前端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转发的超时时间,以便我可以将此问题从我的直接关注中消除?有哪些可访问的参数设置可供使用?

8个回答

41

在我的情况下,我不得不更改以下属性:

zuul.host.socket-timeout-millis=30000

12
这是不使用功能区时的解决方案。 - Meysam
4
可以将此解决方案针对每个主机进行应用,以避免将其应用于所有端点吗? - Alex
你能解释一下这个是做什么的吗?它是用来增加用户登录之间超时时间的设置,还是用于在30秒后关闭页面的设置? - cluis92

38

需要设置的属性是:ribbon.ReadTimeout(适用于所有服务)和 <service>.ribbon.ReadTimeout(适用于特定服务),单位为毫秒。在Ribbon wiki中有一些示例。 这个javadoc包含了属性名称。


谢谢,这很有帮助。我在哪里可以找到所有这些参数的默认设置? - EvilJinious1
这些是配置:com.netflix.client.config.DefaultClientConfigImpl? - EvilJinious1
1
如果我没有使用功能区,是否可以将此属性设置为不仅适用于功能区? - Alex

23

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

我通过完全禁用超时来解决这个问题:

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

另一个可行的选择是将Zuul的Hystrix隔离策略更改为THREAD:

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

1
非常非常非常感谢您:-) 最后一个对我有用!它有一些缺点吗?哦天啊..不再超时了..谢谢 - phil
1
我不确定,但我认为没有问题。实际上,我们迄今为止在生产中使用它而没有问题。您可以在此处阅读有关SEMAPHORE是默认实现的更多信息。https://dev59.com/xl0a5IYBdhLWcg3wxbHm - codependent
要将此用于特定服务的隔离:#为单个服务禁用Hystrix超时:hystrix.command.<serviceName>.execution.timeout.enabled: false#将Hystrix超时时间增加到60秒(每个服务)hystrix.command.<serviceName>.execution.isolation.thread.timeoutInMilliseconds: 60000 - Tim Schimandle

22

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

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

这对我有用。简短明了。谢谢兄弟。 - Chetan Oswal

17

我不得不修改了两个超时时间,以强制Zuul停止对长时间运行的请求超时。即使Hystrix超时被禁用,Ribbon仍会超时。

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

1
谢谢你,上一次我登录StackOverflow是在2016年,我必须登录才能说谢谢并点赞。 - Babajide Prince

7
如果Zuul使用服务发现,您需要使用ribbon.ReadTimeoutribbon.SocketTimeout Ribbon属性来配置这些超时时间。
如果您已经通过指定URL配置了Zuul路由,则需要使用zuul.host.connect-timeout-milliszuul.host.socket-timeout-millis
所谓的路由是指...
zuul:
  routes:
    dummy-service:
      path: /dummy/**

3

我遇到了类似的问题,尝试全局设置超时时间,并且为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

参考


2
针对服务的特定路由,超时设置如何? - Ivan

1

只有这些在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

希望能对某人有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接