链路梳理
在介绍超时重试之前,先梳理下调用链路,因为每个项目的调用链路不一样,配置则不同。
本次测试的链路是 用户->zuul->person-client(配置ribbon,hystrix fallback)->person-service(配置hystrix)
Springcloud超时&重试介绍
springcloud全家桶里很多组件都有超时重试机制,这篇文章简单梳理下期中各个组件的配置和作用。
超时组件:zuul,ribbon,feign,hystrix
重试组件:zuul,ribbon,feign。
其中ribbon和feign有冲突,因此springcloud默认将feign超时重试机制关闭。
超时&重试配置
1、hystrix超时配置:hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=500 #设置500ms,默认1000ms,对应方法要写上@HystrixCommand,否则无法生效
2、ribbon超时配置(客户端配置):
ribbon.OkToRetryOnAllOperations=true
#默认禁止重试
ribbon.MaxAutoRetries=2
#当前重试次数
ribbon.MaxAutoRetriesNextServer=2
#下一个节点重试次数(这里实际上会重试9次,(正常调用+MaxAutoRetries)*(当前节点调用+MaxAutoRetriesNextServer))
ribbon.ReadTimeout=200
#ribbon超时时间
ribbon.ConnectTimeout=100
#连接时间
如果在调用链路中有配置ribbon和hystrix,则哪个时间小则以哪个为准
3、zuul 中配置超时时间,据官方的介绍,分两种情况:
用 serviceId 进行路由时,使用ribbon.ReadTimeout
和ribbon.SocketTimeout
设置
用指定 url 进行路由时,使用zuul.host.connect-timeout-millis
和zuul.host.socket-timeout-millis
设置
总结
1、如果zuul超时时间小于ribbon重试,则以zuul超时时间为准,否则以ribbon为界限
2、若为配置ribbon重试机制,则正常链路中无重试功能