关于feign的超时时间和重试次数

Ribbon(单独配置)

Feign默认情况下hystrix是不启用的,且Feign的底层是调用ribbon来实现负载均衡的,所以ribbon的调用时间就是feign的调用时间

feign:
  hystrix:
    enabled: false #Feign是否启用断路器,默认为false
#全局配置    
ribbon:
  ConnectTimeout: 3000 #连接超时时间(ms)
  ReadTimeout: 3000 #通信超时时间(ms)
  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
  OkToRetryOnAllOperations: false  #是否所有操作都重试 
#某个服务设置 
test:
  ribbon:
    ConnectTimeout: 3000 #连接超时时间(ms)
    ReadTimeout: 3000 #通信超时时间(ms)
    MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
    MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
    OkToRetryOnAllOperations: false  #是否所有操作都重试

根据上面的参数计算重试的次数 -- 重试3次 则一共产生4次调用:
MaxAutoRetries+MaxAutoRetriesNextServer+(MaxAutoRetries *MaxAutoRetriesNextServer)

Ribbon+Feign

Feign默认支持Ribbon;Ribbon的重试机制和Feign的重试机制有冲突,所以源码中默认关闭Feign的重试机制,使用Ribbon的重试机制

Ribbon+Feign+Hystrix

hystrix启用之后,ribbon的超时时间和Hystrix的超时时间的结合就是Feign的超时时间,一般情况下 都是 ribbon 的超时时间(<)hystrix的超时时间(因为涉及到ribbon的重试机制)

feign:
  hystrix:
    enabled: true
#hystrix的超时时间
hystrix:
    command:
        default:
            execution:
              timeout:
                enabled: true #false:ribbon控制超时;true:hystrix和ribbon谁小谁生效,默认为true
              isolation:
                    thread:
                        timeoutInMilliseconds: 30000
ribbon:
  ReadTimeout: 10000 #处理请求的超时时间,默认为1秒
  ConnectTimeout: 3000 #连接建立的超时时长,默认1秒
  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用,默认为1次
  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用,默认为0次
  OkToRetryOnAllOperations: false  #是否所有操作都重试,默认为false,为false时,只会对get请求进行重试,默认情况下,GET方式请求无论是连接异常还是读取异常,都会进行重试,非GET方式请求,只有连接异常时,才会进行重试                

说明

  1. 如果hystrix.command.default.execution.timeout.enabled为true,则会有两个执行方法超时的配置,一个就是ribbon的ReadTimeout,一个就是熔断器hystrix的timeoutInMilliseconds, 此时谁的值小谁生效
  2. 如果hystrix.command.default.execution.timeout.enabled为false,则熔断器不进行超时熔断,而是根据ribbon的ReadTimeout抛出的异常而熔断,也就是取决于ribbon
  3. ribbon的ConnectTimeout,配置的是请求服务的超时时间,除非服务找不到,或者网络原因,这个时间才会生效
  4. ribbon还有MaxAutoRetries对当前实例的重试次数,MaxAutoRetriesNextServer对切换实例的重试次数, 如果ribbon的ReadTimeout超时,或者ConnectTimeout连接超时,会进行重试操作
  5. 由于ribbon的重试机制,通常熔断的超时时间需要配置的比ReadTimeout长,ReadTimeoutConnectTimeout长,否则还未重试,就熔断了
  6. 为了确保重试机制的正常运作,理论上(以实际情况为准)建议hystrix的超时时间为:(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout