attemptExecution()判断条件中还涉及到HALF_OPEN的逻辑,如果熔断开启,下一次请求的时候,会判断当前时间距离上一次时间是否超过了5s钟,如果没有超过,则会将熔断状态从OPEN变为HALF_OPEN,此时会放一个请求按照正常逻辑去执行:
执行失败,熔断状态又会从HALF_OPEN变成OPEN。
执行成功,熔断状态从HALF_OPEN变成CLOSED,并清除熔断相关设置
执行成功后代码:
class HystrixCircuitBreakerImpl implements HystrixCircuitBreaker { public void markSuccess() { if (status.compareAndSet(Status.HALF_OPEN, Status.CLOSED)) { //This thread wins the race to close the circuit - it resets the stream to start it over from 0 metrics.resetStream(); Subscription previousSubscription = activeSubscription.get(); if (previousSubscription != null) { previousSubscription.unsubscribe(); } Subscription newSubscription = subscribeToStream(); activeSubscription.set(newSubscription); circuitOpened.set(-1L); } } }上面对整个熔断的状态:CLOSED、OPEN、HALF_OPEN梳理的已经很清楚了,下面看看降级是该如何处理的吧。
fallback降级机制上面已经讲解了Hystrix 熔断开启的机制等内容,这里主要是说如果一个请求失败(线程池拒绝、超时、badRequest等),那么Hystrix是如何执行降级的呢?
还是回到我们最初的代码 HystrixInvocationHandler类中,看看其invoke()方法中的getFallback回调函数:
protected Object getFallback() { if (fallbackFactory == null) { return super.getFallback(); } try { // 通过我们配置好的fallbackFactory找到对应的FeignClient,这里是获取ServiceAFeignClient Object fallback = fallbackFactory.create(getExecutionException()); // fallbackMap中key为ServiceAFeignClient.sayHello(Integer) // 获取具体的降级method方法 Object result = fallbackMethodMap.get(method).invoke(fallback, args); if (isReturnsHystrixCommand(method)) { return ((HystrixCommand) result).execute(); } else if (isReturnsObservable(method)) { // Create a cold Observable return ((Observable) result).toBlocking().first(); } else if (isReturnsSingle(method)) { // Create a cold Observable as a Single return ((Single) result).toObservable().toBlocking().first(); } else if (isReturnsCompletable(method)) { ((Completable) result).await(); return null; } else { return result; } } catch (IllegalAccessException e) { // shouldn't happen as method is public due to being an interface throw new AssertionError(e); } catch (InvocationTargetException e) { // Exceptions on fallback are tossed by Hystrix throw new AssertionError(e.getCause()); } } };这里很简单,其实就是先获取到我们自己在FallbackFactory中配置的的降级方法,然后执行降级逻辑。
总结这一讲核心逻辑主要是Hystrix熔断状态的变化,主要是CLOSED、OPEN、HALF_OPEN几种状态触发的时间,互相转变的流程,以及执行降级逻辑的原理。
我们仍然是用一个流程图来总结一下:
高清大图链接:
https://www.processon.com/view/link/5e1ee0afe4b0c62462aae684
(点击原文可以直接查看大图哦