1 背景: 在进行Feign调用时对于耗时较长的业务会发生超时而返回异常,以此需要根据业务需求配置超时时间,其中涉及到Hystrix超时时间和Ribbon超时时间,对于Hystrix的隔离机制分为信号量隔离和线程池隔离,对于请求业务和处理业务在一个线程的推荐采用信号量隔离,对于rpc调用等耗时业务采用线程池隔离,默认超时时长为1s,当超时后会熔断处理。
#hystrix的超时时间
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 9000
#ribbon的超时时间
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
2 重试机制:feign的超时时间为hystrix和rabbin的总时间,然而超时的请求并不是直接返回异常,当第一次请求超时请求失败时往往会重试当前请求,对于feign调用默认关闭掉了feign的重试,采用ribbon负载均衡重试:
ribbon:
ReadTimeout: 3000
ConnectTimeout: 3000
MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
OkToRetryOnAllOperations: false #是否所有操作都重试
注意:hystrix超时时间要大于ribbon的超时时间,否则ribbon的重试是没有任何意义的,以为当hystrix超时了会熔断降级(当然需要自己手动指定降级逻辑处理),就不会进行ribbon的重试。