Spring Cloud Hystrix面试题大全
目录
Hystrix实现了开关降级、超时降级、熔断降级
1、【入口】通过HystrixCommand和HystrixCollapser注解修饰的方法,会被HystrixCommandAspect进行aop处理
2、【缓存】如RequestCache打开,则判断缓存是否命中
3、【熔断】判断是否有被开关、熔断降级,若被降级,则走降级逻辑;若未被降级,则走正常逻辑
4、【隔离】根据配置走线程池隔离或信号量隔离,任务满则走降级逻辑
5、【执行】执行任务,若任务执行失败或异常,则进入降级逻辑
6、【超时】通过定时器延时任务检测业务调用执行是否超时,若超时则取消业务执行的线程,进入降级逻辑;若未超时,则正常返回
7、【降级】若进入降级逻辑,根据getFallback()方法,返回降级处理的数据,若未实现该方法,则返回异常
8、【统计】业务调用执行结果成功、失败、超时等均会进入统计模块,通过健康统计结果来决定熔断器打开或关闭
缓存在高并发的环境下使用,能够有效地减少服务器的压力,使用Hystrix返回结果缓存,后续请求可以直接调用缓存数据,该缓存就是RequestCache。
Hystrix提供了RequestCache的参数:
requestCache.enabled 设置是否缓存请求 默认值true
Hystrix提供了开关降级的参数:
circuitBreaker.forceOpen:熔断器强制打开,该状态下它将拒绝所有请求。默认值FALSE。
circuitBreaker.forceClosed:熔断器强制关闭,在此状态下,无论错误百分比如何,它都将允许请求。默认值FALSE。
Hystrix提供了超时降级的参数:
execution.isolationthread.timeoutInMilliseconds:超时时间,默认值为1000
execution.timeout.enabled:是否启用超时时间,默认值为true
execution.isolation.thread.interruptOnTimeout:超时后是否允许 interrupt,默认为 true
execution.isolation.thread.interruptOnCancel:cancel 后是否 interrupt,默认为 false
Hystrix提供了熔断降级的参数:
circuitBreaker.requestVolumeThreshold:触发熔断判断的请求次数阈值,默认值为20,是一段时间内至少有20个请求才进行熔断降级计算。比如一段时间有19个请求全部失败,错误率是100%,但熔断器不会打开,因为总请求数不满足20。
circuitBreaker.sleepWindowInMilliseconds:半开状态试探睡眠时间,默认值5000ms,如熔断器开启5000ms后,会尝试翻过去一部分流量进行试探,确定依赖服务是否恢复
circuitBreaker.errorThresholdPersentage:错误率,默认值50%,例如一段时间(10s)内有100个请求,其中有54个超时或者有异常,则错误率是54%,大于默认值50%,这种情况下触发熔断器开关。
线程池隔离和信号量隔离是用于限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用
THREAD(线程隔离):使用该方式,HystrixCommand将会在单独的线程上执行,并发请求受线程池中线程数量的限制。
SEMAPHORE(信号量隔离):使用该方式,HystrixCommand将会在调用线程上执行,开销相对较小,并发请求受信号量的个数的限制。
配置:hystrix.command.default.execution.isolation.strategy 隔离策略,默认是Thread, 可选Thread|Semaphore