对于通过 Zuul 处理的请求,我们需要牢记 3 件事
1) 根据本文件 -https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.4.3.RELEASE/single/spring-cloud-netflix.html#_zuul_eager_application_context_loading https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.4.3.RELEASE/single/spring-cloud-netflix.html#_zuul_eager_application_context_loading
Zuul 内部使用 Ribbon 来调用远程 url,并且默认情况下,Ribbon 客户端在第一次调用时由 Spring Cloud 延迟加载。可以使用以下配置更改 Zuul 的此行为,并将导致与功能区相关的子应用程序上下文在应用程序启动时急切地加载。
应用程序.yaml
zuul:
ribbon:
eager-load:
enabled: true
应用程序属性
zuul.ribbon.eager-load.enabled= true
2)根据本文件 -http://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_service_discovery_configuration http://cloud.spring.io/spring-cloud-static/Edgware.SR3/single/spring-cloud.html#_service_discovery_configuration
服务发现配置---
如果 Zuul 使用服务发现,则需要关注两个超时,Hystrix 超时(因为默认情况下所有路由都包含在 Hystrix 命令中)和 Ribbon 超时。 Hystrix 超时需要考虑功能区读取和连接超时以及该服务将发生的重试总数。默认情况下,Spring Cloud Zuul 将尽力为您计算 Hystrix 超时,除非您明确指定 Hystrix 超时。
Hystrix 超时使用以下公式计算:
(ribbon.ConnectTimeout + ribbon.ReadTimeout) * (ribbon.MaxAutoRetries + 1) *
(ribbon.MaxAutoRetriesNextServer + 1)
例如,如果您在应用程序属性中设置以下属性
应用程序.yaml
ribbon:
ReadTimeout:100
ConnectTimeout:500
MaxAutoRetries:1
MaxAutoRetriesNextServer:1
应用程序属性
ribbon.ReadTimeout= 100
ribbon.ConnectTimeout= 500
ribbon.MaxAutoRetries= 1
ribbon.MaxAutoRetriesNextServer= 1
然后 Hystrix 超时(对于本例中的所有路由)将设置为 2400ms。
在我的 zuul 应用程序配置中,我添加了以下属性。它适用于我的第一次通话,没有任何错误。
应用程序.yaml
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 11000
ribbon:
ConnectTimeout: 10000
ReadTimeout: 10000
应用程序属性
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 11000
ribbon.ConnectTimeout= 10000
ribbon.ReadTimeout: 10000
3)这是最简单的方法。禁用 hystrix 执行超时。
根据这份文件——https://github.com/Netflix/Hystrix/wiki/Configuration#executiontimeoutenabled https://github.com/Netflix/Hystrix/wiki/Configuration#executiontimeoutenabled
以下属性将禁用 Zuul 上的 hystrix 执行超时
应用程序属性
hystrix.command.default.execution.timeout.enabled=false
如果我们牢记这3个场景,那么我们就可以轻松得到ZuulException(SendErrorFilter)的解决方案。