相关配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#如果路由转发请求发生超时(连接超时或处理超时), 只要超时时间的设置小于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

实现

  1. SimpleRouteLocator#getRoute返回的route对象中会带上retryable的设置.
  2. PreDecorationFilter在对RequestContext进行装饰的时候会将retryable的设置通过keyFilterConstants.RETRYABLE_KEY注入RequestContext中.
  3. RibbonRoutingFilter#buildCommandContext会使用RequestContextretryable设置构造RibbonCommandContext对象.
  4. RibbonCommandFactory使用RibbonCommandContext构建出RibbonCommand对象.
  5. RibbonCommand#run中, 当retryabletrue时, 会调用IClientexecute方法处理请求. 为false时, 会调用IClientexecuteWithLoadBalancer方法执行请求.
    • execute会在失败时进行重试(不超过超时限制)
    • executeWithLoadBalancer方法是先通过LoadBalancer选择出一个Server, 然后构建出请求地址.
  6. IClient#execute执行时, 通过LoadBalancedRetryPolicyFactory创建一个LoadBalancedRetryPolicy对象. LoadBalancedRetryPolicy持有上面ribbon.XXX的设置. 当响应状态码不在ribbon.retryableStatusCodes设置中, 则会直接返回响应. 如果属于可重试的响应状态码, 则会将响应封装为HttpClientStatusCodeException抛出. 异常被RetryTemplate捕获, 然后使用LoadBalancedRetryPolicy对当前状态(MaxAutoRetries, MaxAutoRetriesNextServer)计算出能否进行一次重试. 直至成功, 或者当前状态不满足条件.