摘要: 原创出处 http://www.iocoder.cn/Hystrix/command-execute-fourth-fallback/ 「芋道源码」欢迎转载,保留摘要,谢谢!
本文主要基于 Hystrix 1.5.X 版本
本文主要分享 Hystrix 命令执行(四)之失败回退逻辑。
建议 :对 RxJava 已经有一定的了解的基础上阅读本文。
Hystrix 执行命令整体流程如下图:
short-circuit
,处理链路处于熔断的回退逻辑,在 「3. #handleShortCircuitViaFallback()」 详细解析。 semaphore-rejection
,处理信号量获得失败的回退逻辑,在 「4. #handleShortCircuitViaFallback()」 详细解析。 thread-pool-rejection
,处理线程池提交任务拒绝的回退逻辑,在 「5. #handleThreadPoolRejectionViaFallback()」 详细解析。 execution-timeout
,处理命令执行超时的回退逻辑,在 「6. #handleTimeoutViaFallback()」 详细解析。execution-failure
,处理命令执行异常的回退逻辑,在 「7. #handleFailureViaFallback()」 详细解析。bad-request
,TODO 【2014】【HystrixBadRequestException】,和 hystrix-javanica
子项目相关。另外,#handleXXXX()
方法,整体代码比较类似,最终都是调用 #getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。
推荐 Spring Cloud 书籍:
在 《Hystrix 源码解析 —— 命令执行(一)之正常执行逻辑》「4. #executeCommandAndObserve(…)」 中,#executeCommandAndObserve(...)
的第 82 行 onErrorResumeNext(handleFallback)
代码,通过调用 Observable#onErrorResumeNext(...)
方法,实现【执行命令 Observable】执行异常时,返回【回退逻辑 Observable】,执行失败回退逻辑。
FROM 《ReactiveX文档中文翻译》「onErrorResumeNext」
onErrorResumeNext 方法返回一个镜像原有 Observable 行为的新 Observable ,后者会忽略前者的 onError 调用,不会将错误传递给观察者,作为替代,它会开始镜像另一个,备用的 Observable 。
- Javadoc: onErrorResumeNext(Func1))
- Javadoc: onErrorResumeNext(Observable))
handleFallback
变量,代码如下 :
|
executionResult
执行异常。thread-pool-rejection
,处理线程池提交任务拒绝的回退逻辑,在 「5. #handleThreadPoolRejectionViaFallback()」 详细解析。 execution-timeout
,处理命令执行超时的回退逻辑,在 「6. #handleTimeoutViaFallback()」 详细解析。bad-request
,TODO 【2014】【HystrixBadRequestException】,和 hystrix-javanica
子项目相关。execution-failure
处理命令执行异常的回退逻辑,在 「7. #handleFailureViaFallback()」 详细解析。#handleShortCircuitViaFallback()
方法,short-circuit
,处理链路处于熔断的回退逻辑,在 此处 被调用,代码如下 :
|
executionResult
执行异常。#getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。#handleSemaphoreRejectionViaFallback()
方法,semaphore-rejection
,处理信号量获得失败的回退逻辑,在 此处 被调用,代码如下 :
|
executionResult
执行异常。#getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。#handleThreadPoolRejectionViaFallback()
方法,thread-pool-rejection
,处理线程池提交任务拒绝的回退逻辑,在 此处 被调用,代码如下:
|
#getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。#handleTimeoutViaFallback()
方法,execution-timeout
,处理命令执行超时的回退逻辑,在 此处 被调用,代码如下:
|
#getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。#handleFailureViaFallback()
方法,execution-failure
,处理命令执行异常的回退逻辑,在 此处 被调用,代码如下:
|
executionResult
异常。#getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。#getFallbackOrThrowException()
方法,获得【回退逻辑 Observable】或者【异常 Observable】,代码如下 :
|
executionResult
添加( 记录 )事件。#isUnrecoverable(Exception)
方法,若异常不可恢复,直接返回【异常 Observable】。点击 链接 查看该方法。#isRecoverableError(Exception)
方法,若异常可恢复,打印 WARN
日志。点击 链接 查看该方法。主要针对 java.lang.Error
情况,打印 #isUnrecoverable(Exception)
排除掉的 Error。HystrixCommandProperties.fallbackEnabled = false
( 默认值 :true
) ,即失败回退功能关闭,调用 #handleFallbackDisabledByEmittingError()
,返回【异常 Observable】。点击 链接 查看该方法。#handleFallbackRejectionByEmittingError()
,返回【异常 Observable】。点击 链接 查看该方法。HystrixCommandProperties.fallbackEnabled = true
( 默认值 :true
) ,即失败回退功能开启。第 56 至 95 行 :处理回退逻辑执行发生异常的 Func1 ,返回【异常 Observable】。
#getExceptionFromThrowable(Throwable)
方法,获得 Exception 。若 t
的类型为 Throwable 时,包装成 Exception 。点击 链接 查看该方法代码。fe
的类型为 UnsupportedOperationException 时,使用 e
+ fe
创建 HystrixRuntimeException 。该异常发生于 HystrixCommand#getFallback()
抽象方法未被覆写。fe
的类型为其他异常时,使用 e
+ fe
创建 HystrixRuntimeException 。该异常发生于 HystrixCommand#getFallback()
执行发生异常。#shouldNotBeWrapped()
方法,判断 originalException
是 ExceptionNotWrappedByHystrix 的实现时,即要求返回的【异常 Observable】不使用 HystrixRuntimeException 包装。点击 链接 查看该方法代码。toEmit
( HystrixRuntimeException ) 为异常。第 98 行 :调用 #getFallbackSemaphore()
方法,获得失败回退信号量( TryableSemaphore )对象,点击 链接 查看该方法代码。TryableSemaphore 在 《Hystrix 源码解析 —— 命令执行(一)之正常执行逻辑》「3. TryableSemaphore」 有详细解析。
#getFallbackObservable()
方法,创建【回退逻辑 Observable】。将子类对 HystrixCommand#getFallback()
抽象方法的执行结果,使用 Observable#just(...)
包装返回。点击 链接 查看该方法的代码。
#isFallbackUserDefined()
方法,返回命令子类是否实现 HystrixCommand#getFallback()
抽象方法。只有已实现( true
) 的情况下,调用 HOOK TODO 【2003】【HOOK】。Observable#onErrorResumeNext(...)
方法,实现【失败回退 Observable】执行异常时,返回【异常 Observable】。有两个注意点: