熔断器 Hystrix 源码解析 —— 请求执行(四)之失败回退逻辑

本文深入剖析 Hystrix 命令执行的失败回退逻辑,涵盖 handleShortCircuitViaFallback、handleSemaphoreRejectionViaFallback、handleThreadPoolRejectionViaFallback、handleTimeoutViaFallback 和 handleFailureViaFallback 等关键方法,揭示服务降级的实现细节。适合对 RxJava 有一定了解的读者阅读。
摘要由CSDN通过智能技术生成

摘要: 原创出处 http://www.iocoder.cn/Hystrix/command-execute-fourth-fallback/ 「芋道源码」欢迎转载,保留摘要,谢谢!

本文主要基于 Hystrix 1.5.X 版本


������关注微信公众号:【芋道源码】有福利:
1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
4. 新的源码解析文章实时收到通知。每周更新一篇左右
5. 认真的源码交流微信群。


1. 概述

本文主要分享 Hystrix 命令执行(四)之失败回退逻辑

建议 :对 RxJava 已经有一定的了解的基础上阅读本文。

Hystrix 执行命令整体流程如下图:

FROM 《【翻译】Hystrix文档-实现原理》「流程图」

另外,#handleXXXX() 方法,整体代码比较类似,最终都是调用 #getFallbackOrThrowException() 方法,获得【回退逻辑 Observable】或者【异常 Observable】,在 「8. #getFallbackOrThrowException(…)」 详细解析。


推荐 Spring Cloud 书籍

2. handleFallback

《Hystrix 源码解析 —— 命令执行(一)之正常执行逻辑》「4. #executeCommandAndObserve(…)」 中,#executeCommandAndObserve(...)第 82 行 onErrorResumeNext(handleFallback) 代码,通过调用 Observable#onErrorResumeNext(...) 方法,实现【执行命令 Observable】执行异常时,返回【回退逻辑 Observable】,执行失败回退逻辑。

FROM 《ReactiveX文档中文翻译》「onErrorResumeNext」
onErrorResumeNext 方法返回一个镜像原有 Observable 行为的新 Observable ,后者会忽略前者的 onError 调用,不会将错误传递给观察者,作为替代,它会开始镜像另一个,备用的 Observable 。

handleFallback 变量,代码如下 :

  1: final Func1<Throwable, Observable<R>> handleFallback = new Func1<Throwable, Observable<R>>() {
   
  2:     @Override
  3:     public Observable<R> call(Throwable t) {
   
  4:         // 标记尝试成功
  5:         circuitBreaker.markNonSuccess();
  6:         // 标记 executionResult 执行异常
  7:         Exception e = getExceptionFromThrowable(t);
  8:         executionResult = executionResult.setExecutionException(e);
  9:         // 返回 【回退逻辑 Observable】
 10:         if (e instanceof RejectedExecutionException) { // 线程池提交任务拒绝异常
 11:             return handleThreadPoolRejectionViaFallback(e);
 12:         } else if (t instanceof HystrixTimeoutException) { // 执行命令超时异常
 13:             return handleTimeoutViaFallback();
 14:         } else if (t instanceof HystrixBadRequestException) { // TODO 【2014】【HystrixBadRequestException】
 15:             return handleBadRequestByEmittingError(e);
 16:         } else {
   
 17:             /*
 18:              * Treat HystrixBadRequestException from ExecutionHook like a plain HystrixBadRequestException.
 19:              */
 20:             if (e instanceof HystrixBadRequestException) { // TODO 【2014】【HystrixBadRequestException】
 21:                 eventNotifier.markEvent(HystrixEventType.BAD_REQUEST, commandKey);
 22:                 return Observable.error(e);
 23:             }
 24: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值