通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际使用过程中经常碰到开发反应“莫名”触发了降级逻辑的情况。

为了更精准的定位触发原因,或是在降级逻辑中需要根据不同的异常做不同的处理时,在降级方法中,我们希望可以获取到主逻辑中抛出的异常信息。接下来就来介绍一下Hystrix两种不同实现方式中如何在降级逻辑中获取异常信息的方法。

注解方式

先介绍一下用注解方式定义的Hystrix命令是如何在降级逻辑中获取异常的,实现非常简单,先看下面的例子:

  1. @HystrixCommand(fallbackMethod = "fallback")

  2. User getUserById(String id) {

  3.    throw new RuntimeException("getUserById command failed");

  4. }

  5. User fallback(String id, Throwable throwable) {

  6.    return new User("def", "def");

  7. }

这里定义了一个主逻辑函数 getUserById,主逻辑中会主动抛出一个异常,从而触发该主逻辑的降级函数 fallback。重点看 fallback函数中的最后一个传参 Throwablethrowable。通过这样的简单定义,开发人员就可以很方便的获取触发降级逻辑的异常信息,用作日志记录或者其它复杂的业务逻辑了。

继承方式

在继承方式中要获取触发异常也非常简单,具体如下:

  1. public static class UserCommand extends HystrixCommand<User> {

  2.    protected UserCommand() {

  3.        super(HystrixCommandGroupKey.Factory.asKey("UserCommand"));

  4.    }

  5.    @Override

  6.    protected User run() throws Exception {

  7.        throw new RuntimeException("getUserById command failed");

  8.    }

  9.    @Override

  10.    protected User getFallback() {

  11.        System.out.println(getFailedExecutionException().getMessage());

  12.        return new User("def", "def");

  13.    }

  14. }

上面的实现同上一节注解方式的实现一样,在使用继承方式的时候通过 getFailedExecutionException方法就可以获取到触发降级的异常信息了。

总结

我们在实际使用Hystrix的时候,有时候一些业务异常或者内部RPC由服务提供方抛出的异常在消费方没能考虑周到,会触发一些意料之外的降级。所以在降级逻辑中,建议每一段都加入触发异常的日志记录,以方便定位问题原因。

- END -

 往期推荐:

  • 死磕Java系列:

  1. 深入分析ThreadLocal

  2. 深入分析synchronized的实现原理

  3. 深入分析volatile的实现原理

  4. Java内存模型之happens-before

  5. Java内存模型之重排序

  6. Java内存模型之分析volatile

  7. Java内存模型之总结

  8. J.U.C之AQS简介

  9. J.U.C之AQS:CLH同步队列

  10. J.U.C之AQS同步状态的获取与释放

  11. J.U.C之AQS阻塞和唤醒线程

  12. J.U.C之重入锁:ReentrantLock

  13. J.U.C之读写锁:ReentrantReadWriteLock

  14. J.U.C之Condition

  15. J.U.C之并发工具类:CyclicBarrier

  16. J.U.C之并发工具类:Semaphore

  17. J.U.C之并发工具类:CountDownLatch

  18. J.U.C之并发工具类:Exchanger

……

  • Spring系列:

  1. Spring Cloud Zuul中使用Swagger汇总API接口文档

  2. Spring Cloud Config Server迁移节点或容器化带来的问题

  3. Spring Cloud Config对特殊字符加密的处理

  4. Spring Boot使用@Async实现异步调用:使用Future以及定义超时

  5. Spring Cloud构建微服务架构:分布式配置中心(加密解密)

  6. Spring Boot快速开发利器:Spring Boot CLI

……

可关注我的公众号

深入交流、更多福利

扫码加入我的知识星球

点击“阅读原文”,看本号其他精彩内容

Hystrix降级逻辑中如何获取触发的异常?相关推荐

  1. Hystrix降级逻辑中如何获取触发的异常

    通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...

  2. Hystrix降级逻辑中如何获取触发的异常 1

    通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...

  3. 微服务之Hystrix降级熔断

    前言 分布式系统面临的问题-----服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"扇出".如果扇出的链 ...

  4. feign 第一次调用超时_feign + hystrix 降级

    feign 启用 hystrix feign 默认没有启用 hystrix,添加配置,启用 hystrix feign.hystrix.enabled=true application.yml 添加配 ...

  5. Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索

    Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索 简介 上文中分析了数据库连接池的初始化部分,接下来我们来看看获取连接部分的代码 数据库连接池中连接获取 下面的相关的代码,在代码 ...

  6. 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟

    很多时候我们使用函数 gettimeofday 以及 clock_gettime 作为我们获取 wall lock的时钟函数. 因为这两种函数是 glibc 提供的用户封装,简单易用,而且能够精确到 ...

  7. ASP.NET中gridview获取当前行的索引值

    在用GridView控件时,我们经常会碰到获取当前行的索引,通过索引进行许多操作.例如,可以获得当前行某一个控件元素:设置某一元素的值等等.下面结合实例介绍几种获得GridView当前行索引值的方法. ...

  8. thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)

    thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...

  9. Jenkins pipeline job 根据参数动态获取触发事件的分支

    此文需要有Jenkins pipeline job 的简单使用经验 场景 我们日常的测试函数, 一般是不能仅仅在本地跑的,还需要一个公共的跑测试的环境,作为合并新的PR的依据. 如果用Jenkins ...

最新文章

  1. 正确的WordPress文件权限[关闭]
  2. 认认真真推荐9个值得关注的公众号
  3. 如何利用CycleGAN实现男女性别转换
  4. 9于word没有注册类_XPage系列这次升级后终于是全自动化注册了!
  5. 客观地认识程序员心中的恐惧
  6. html5中在canvas上绘图
  7. [hackinglab][CTF][综合关][2020] hackinglab 综合关 writeup
  8. 开源SUP对接API卡盟程序卡信乐v2.0源码
  9. 程序员疫苗:代码注入
  10. mysql常量求和_Mysql之:count(*)、count(常量)、count(字段)的区别
  11. jdbc 连接阿里云mysql数据库_java jdbc连接数据库
  12. Windows 生成ffmpeg安卓全平台so
  13. 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载 v11.6官方版-下载啦
  14. 获取深户股市列表api_获取股票api
  15. 横沥东莞注塑工艺需要考虑的7个因素
  16. 从MIXMAX概率模型理解Bayesian建模方法
  17. MxN螺旋矩阵(由外向内)
  18. 关于将微信小程序部署到云服务器上的具体步骤
  19. MD5单向散列算法详解
  20. 项目管理协会(PMI)人才三角

热门文章

  1. linux 功能测试宏 POSIX_C_SOURCE
  2. linux 内核 同步机制
  3. Linux ps命令详解与示例说明
  4. 关于windowsx.h的介绍
  5. http抓包工具推荐WSockExpert/httpwatch/HttpAnalyzer/DebugBar
  6. Linux内核探讨-- 第五章
  7. 对网上花店系统进行软件测试,网上花店系统
  8. c++ 缓存和缓冲_【嵌入式C】放弃printf,选择了精简snprintf
  9. linux发布java网站_Linux下部署java web项目
  10. 3 账套升级u8_用友U8条码管理的应用对仓库有什么好处?