通过之前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,我们已经知道如何通过Hystrix来保护自己的服务不被外部依赖方拖垮的情况。但是实际使用过程中经常碰到开发反应“莫名”触发了降级逻辑的情况。为了更精准的定位触发原因,或是在降级逻辑中需要根据不同的异常做不同的处理时,在降级方法中,我们希望可以获取到主逻辑中抛出的异常信息。接下来就来介绍一下Hystrix两种不同实现方式中如何在降级逻辑中获取异常信息的方法。

注解方式

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

@HystrixCommand(fallbackMethod = "fallback")User getUserById(String id) {    throw new RuntimeException("getUserById command failed");}

User fallback(String id, Throwable throwable) {    return new User("def", "def");}

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

继承方式

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

public static class UserCommand extends HystrixCommand<User> {

    protected UserCommand() {        super(HystrixCommandGroupKey.Factory.asKey("UserCommand"));    }

    @Override    protected User run() throws Exception {        throw new RuntimeException("getUserById command failed");    }

    @Override    protected User getFallback() {        System.out.println(getFailedExecutionException().getMessage());        return new User("def", "def");    }

}

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

总结

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

以下专题教程也许您会有兴趣

  • Spring Boot基础教程
  • Spring Cloud基础教程

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

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

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

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

    通过之前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. 双一流高校竟有超30所都筹建了医学院!这释放了什么信号?
  2. python unix时间戳格式化输出_python正常时间和unix时间戳相互转换的方法
  3. 分类的评估标准_机器学习:模型评估之评估指标
  4. PostgreSQL 8.0 中文手册
  5. 如何给小白解释什么是编解码器
  6. 微信基于时间序的海量存储扩展性与多机容灾能力提升
  7. inline用法详解
  8. Ruby 和 Python 分析器是如何工作的?
  9. Golang实现简单爬虫框架(5)——项目重构与数据存储
  10. 13004.循环数组队列(C语言)
  11. [转]学习object-c,补习一下指针
  12. RedHat中squid简易配置
  13. PHP应用memcache函数详解
  14. 华为hbase二级索引(secondary index)细节分析
  15. 都不写代码,架构师整天在干啥?
  16. 毕业那天我们一起失恋
  17. EditPlus文本编辑器,中文与破解实战
  18. 【毕业季·进击的技术er】大学生计算机毕业设计应该这样写
  19. 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42...
  20. 机器学习实战之朴素贝叶斯与垃圾邮件分类

热门文章

  1. 未知宽高元素的水平垂直居中
  2. wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
  3. [笔记]Go语言写文件几种方式性能对比
  4. 一个符合SEO优化标准的网站应具备哪些特征?
  5. A5营销:传统企业站优化正文内容在SEO方面的三大注意事项
  6. SQL基础---SQL AND OR 运算符
  7. MsSql正反表达式
  8. vector的内存释放
  9. 用一句话证明你是程序员,你会怎么说
  10. 每日一题(46)—— volatile