首先,hystrix整体流程构造一个HystrixCommand或HystrixObservableCommand对象来封装请求,并在构造方法中配置请求执行所需的参数;执行命令,Hystrix提供了4种执行命令的方式来判断是否使用缓存响应请求,如果启用缓存且缓存可用,则直接使用缓存响应请求。Hystrix支持请求缓存,但需要自定义启动;判断保险丝是否开路,如果是,执行步骤8;判断线程池/队列/信号量是否满,满则执行步骤8;执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或超时,则执行步骤8;否则跳至第9步;统计熔断器监控指标;进入Fallback备份逻辑返回请求响应注:1.第5步线程池当/queue/semaphore满了,会执行第7步的逻辑,更新熔断器统计信息,熔断器统计信息为无论成功与否,都在第6步更新。2.您可以通过重载getCacheKey()方法来启用请求缓存。如果涉及到数据修改,修改时需要清空缓存,通过HystrixRequestCache.clear方法清空。hystrxi设计理念采用命令方式,将所有对外部服务(或依赖)的调用包装在HystrixCommand或HystrixObservableCommand对象中,并在单独的线程中执行;每个依赖维护一个线程池(或信号量),线程池耗尽并拒绝请求(而不是将请求排队)。记录请求成功、失败、超时和线程拒绝。当服务错误百分比超过阈值时,熔断器开关自动打开,在一段时间内停止对服务的所有请求。降级逻辑在请求失败、被拒绝、超时或被炸毁时执行。近乎实时地监控指标和配置修改。二、hystrix容错一、资源隔离资源隔离主要是指线程的隔离。Hystrix提供了两种线程隔离方式:线程池和信号量,默认是线程池。使用线程池时,发送请求的线程与执行依赖服务的线程不同;使用信号量时,发送请求的线程和执行依赖服务的线程是相同的,都是发起请求的线程。线程切换支持异步支持超时支持熔断限流开销semaphorenononoyes小线程池yesyesyes大线程池和semaphore都支持熔断和限流。与线程池相比,信号量不需要线程切换。如果是tomcat服务,信号量使用tomcat线程,线程池是tomcat线程创建的线程池,这样就避免了不必要的开销。但是信号量不支持异步,也不支持超时。也就是说,当请求的服务不可用时,信号量会控制超过限制的请求立即返回,而已经持有信号量的线程只能等待服务响应或超时。回来,可能要等很久。在线程池模式下,当服务超过指定时间没有响应时,Hystrix会通知线程立即结束,通过响应中断返回。根据以上两者的特点,我们可以知道它们各自的适用场景:信号量请求并发量大且耗时(本服务的内存操作等);不会访问外部依赖的服务,因为信号量不支持超时,无法处理超时问题。线程池请求并发量大,耗时长;因为线程池支持超时,所以访问的服务是否依赖于外界无关紧要;如果应用只是适合异步执行,线程池会是一个不错的选择。当然线程池也是需要维护的,所以线程上下文切换也会有开销。2、断路器中有6个重要参数:circuitBreaker.enabled是否开启断路器,默认为TRUE。circuitBreaker.forceOpen强制断开保险丝,并一直保持断开状态,与保险丝开关的实际状态无关。默认值为FLASE。circuitBreaker.forceClosed强制关闭熔断器并始终保持关闭状态,无论熔断器开关的实际状态如何。默认值为FLASE。circuitBreaker.errorThresholdPercentage错误率,默认值为50%。比如一段时间内(10s)有100个请求,其中有54个请求超时或者异常。那么这段时间的错误率为54%,大于默认值50%。这种情况会触发保险丝断开。circuitBreaker.requestVolumeThreshold的默认值为20,意思是在errorThresholdPercentage计算之前的一段时间内至少有20个请求。比如一段时间有19个请求,这几个请求都失败了,错误率为100%,但是熔断器不会打开,请求总数不满足20个circuitBreaker.sleepWindowInMilliseconds的一半-打开状态测试休眠时间,默认值为5000ms。例如:熔断器开启5000ms后,会尝试放掉部分流量进行测试,判断依赖服务是否恢复。开路,即从闭合状态过渡到断开状态(close->open)。然后在SleepWindowInMilliseconds时间内(默认值5000ms),所有通过断路器的请求都会被断开,不调用后端服务,直接使用fallback降级机制。参数时间过后,断路器将变为半开状态。尝试通过断路器传递请求,看能否正常调用。如果调用成功,则自动恢复,熔断器变为闭合状态。3.退化。降级通常是指高峰时段。为了保证核心服务的正常运行,需要停止一些不太重要的业务,或者当某些服务不可用时,执行备份逻辑,使故障服务快速失效或快速返回,以保证主业务不受影响.Hystrix提供的降级主要是为了容错,保证当前服务不受依赖服务失效的影响,从而提高服务的健壮性。为了支持fallback或者回退处理,可以重写HystrixCommand的getFallBack方法或者HystrixObservableCommand的resumeWithFallback方法。Hystrix在以下情况下会遵循降级逻辑:执行construct()或run()抛出异常熔断打开线程池和队列或命令短路命令的信号量容量超限,命令被拒绝,命令执行timeout降级回退的方式有很多种,这里介绍两种:fastfail,fastfail是最常见的命令执行方式,命令不会覆盖降级逻辑。如果在命令执行过程中发生任何类型的失败,它只会抛出一个异常。静默失败,这是通过在回退方法中返回null、空Map、空List或其他类似响应来完成的。我们可以根据自己的业务需求制定降级方案,但是需要注意降级逻辑是否会出现异常。参考文章:深入Hystrix断路器执行原理深入Hystrix线程池隔离与接口限流Hystrix原理与实践
