Spring Cloud为Netflix Zuul提供了支持 -Netflix Zuul是用于创建具有路由和过滤功能的边缘服务的工具包。
在Spring Cloud站点上非常全面地记录了Zuul代理支持。 我的目标是关注与代理服务处理超时有关的一小部分属性。
目标服务和网关
为了更好地研究超时,我创建了一个示例服务( 此处提供代码),该服务将可配置的“延迟”参数作为请求正文的一部分,并且示例请求/响应如下所示:
延迟5秒的样本请求:
{"id": "1","payload": "Hello","delay_by": 5000,"throw_exception": false
}
和预期的响应:
{"id": "1","received": "Hello","payload": "Hello!"
}
该服务已在Eureka中以“ sample-svc”的ID注册,该服务之上的Spring Cloud Zuul代理具有以下配置:
zuul:ignoredServices: '*'routes:samplesvc:path: /samplesvc/**stripPrefix: trueserviceId: sample-svc
本质上,通过Eureka将对/ samplesvc / uri的所有请求转发到名称为“ sample-svc”的歧义服务。
我还在网关顶部有一个UI,可以使具有不同延迟的测试更加容易:
服务延迟测试
将低“延迟”参数添加到服务调用时,网关的行为没有任何与超时相关的问题,但是,如果将延迟参数更改为低至1到1.5秒,则网关将超时。
原因是,如果将网关设置为使用Eureka,则网关将使用Netflix Ribbon组件进行实际呼叫。 此外,将功能区调用包装在Hystrix中,以确保该调用保持容错能力。 我们遇到的第一个超时是因为Hystrix的延迟容限阈值非常低,因此调整hystrix设置应该可以使我们超过第一次超时。
hystrix:command:sample-svc:execution:isolation:thread:timeoutInMilliseconds: 15000
请注意,用于配置的Hystrix“命令键”是在Eureka中注册的服务名称。
对于这个特定的Zuul调用来说,这可能有些微不足道,如果您可以全面地对其进行调整,那么按照以下方式进行配置就可以了:
hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 15000
进行此更改后,通过网关对服务的请求最多可以延迟5秒,而不会出现任何问题。 如果我们超过5秒,尽管会再次超时。 现在,我们达到了Ribbons超时设置,可以通过调整如下所示的配置再次为特定的服务调用以细粒度的方式对其进行配置:
sample-svc:ribbon:ReadTimeout: 15000
通过这两个超时调整,基于网关的呼叫现在应该通过
结论
目的不是显示设置任意高的超时值的方法,而只是显示如何设置可能更适合您的应用程序的值。 合理的超时对于确保不良的服务行为不会累积到用户非常重要。 要注意的一件事是,如果通过指定服务的直接url将网关配置为不使用功能区和Eureka,则这些超时设置根本不相关。
如果您有兴趣进一步探索,请在此处找到示例。
翻译自: https://www.javacodegeeks.com/2016/06/spring-cloud-zuul-support-configuring-timeouts.html