相关配置
#如果路由转发请求发生超时(连接超时或处理超时), 只要超时时间的设置小于Hystrix的命令超时时间,那么它就会自动发起重试. 默认为false. 或者对指定响应状态码进行重试
zuul.retryable = true
zuul.routes.<route>.retryable = false
#同一实例上的最大重试次数, 默认值为0. 不包括首次调用
ribbon.MaxAutoRetries=0
#重试其他实例的最大重试次数, 不包括第一次选的实例. 默认为1
ribbon.MaxAutoRetriesNextServer=1
#是否所有操作执行重试, 默认值为false, 只重试`GET`请求
ribbon.OkToRetryOnAllOperations=false
#连接超时, 默认2000
ribbon.ConnectTimeout=15000
#响应超时, 默认5000
ribbon.ReadTimeout=15000
#每个host的最大连接数
ribbon.MaxHttpConnectionsPerHost=50
#最大连接数
ribbon.MaxTotalHttpConnections=200
#何种响应状态码才进行重试
ribbon.retryableStatusCodes=404,502
实现
SimpleRouteLocator#getRoute
返回的route
对象中会带上retryable
的设置.
PreDecorationFilter
在对RequestContext
进行装饰的时候会将retryable
的设置通过keyFilterConstants.RETRYABLE_KEY
注入RequestContext
中.
RibbonRoutingFilter#buildCommandContext
会使用RequestContext
的retryable
设置构造RibbonCommandContext
对象.
RibbonCommandFactory
使用RibbonCommandContext
构建出RibbonCommand
对象.
RibbonCommand#run
中, 当retryable
为true
时, 会调用IClient
的execute
方法处理请求. 为false
时, 会调用IClient
的executeWithLoadBalancer
方法执行请求.
execute
会在失败时进行重试(不超过超时限制)
executeWithLoadBalancer
方法是先通过LoadBalancer
选择出一个Server
, 然后构建出请求地址.
IClient#execute
执行时, 通过LoadBalancedRetryPolicyFactory
创建一个LoadBalancedRetryPolicy
对象. LoadBalancedRetryPolicy
持有上面ribbon.XXX
的设置. 当响应状态码不在ribbon.retryableStatusCodes
设置中, 则会直接返回响应. 如果属于可重试的响应状态码, 则会将响应封装为HttpClientStatusCodeException
抛出. 异常被RetryTemplate
捕获, 然后使用LoadBalancedRetryPolicy
对当前状态(MaxAutoRetries, MaxAutoRetriesNextServer)计算出能否进行一次重试. 直至成功, 或者当前状态不满足条件.