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