Hystrix降级逻辑中如何获取触发的异常 1
通过之前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相关推荐
- Hystrix降级逻辑中如何获取触发的异常?
通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...
- Hystrix降级逻辑中如何获取触发的异常
通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...
- 微服务之Hystrix降级熔断
前言 分布式系统面临的问题-----服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的"扇出".如果扇出的链 ...
- feign 第一次调用超时_feign + hystrix 降级
feign 启用 hystrix feign 默认没有启用 hystrix,添加配置,启用 hystrix feign.hystrix.enabled=true application.yml 添加配 ...
- Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索
Alibaba Druid 源码阅读(四) 数据库连接池中连接获取探索 简介 上文中分析了数据库连接池的初始化部分,接下来我们来看看获取连接部分的代码 数据库连接池中连接获取 下面的相关的代码,在代码 ...
- 通过 RDTSC 指令从 CPU 寄存器中直接获取系统时钟
很多时候我们使用函数 gettimeofday 以及 clock_gettime 作为我们获取 wall lock的时钟函数. 因为这两种函数是 glibc 提供的用户封装,简单易用,而且能够精确到 ...
- ASP.NET中gridview获取当前行的索引值
在用GridView控件时,我们经常会碰到获取当前行的索引,通过索引进行许多操作.例如,可以获得当前行某一个控件元素:设置某一元素的值等等.下面结合实例介绍几种获得GridView当前行索引值的方法. ...
- thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)
thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...
- Jenkins pipeline job 根据参数动态获取触发事件的分支
此文需要有Jenkins pipeline job 的简单使用经验 场景 我们日常的测试函数, 一般是不能仅仅在本地跑的,还需要一个公共的跑测试的环境,作为合并新的PR的依据. 如果用Jenkins ...
最新文章
- 双一流高校竟有超30所都筹建了医学院!这释放了什么信号?
- python unix时间戳格式化输出_python正常时间和unix时间戳相互转换的方法
- 分类的评估标准_机器学习:模型评估之评估指标
- PostgreSQL 8.0 中文手册
- 如何给小白解释什么是编解码器
- 微信基于时间序的海量存储扩展性与多机容灾能力提升
- inline用法详解
- Ruby 和 Python 分析器是如何工作的?
- Golang实现简单爬虫框架(5)——项目重构与数据存储
- 13004.循环数组队列(C语言)
- [转]学习object-c,补习一下指针
- RedHat中squid简易配置
- PHP应用memcache函数详解
- 华为hbase二级索引(secondary index)细节分析
- 都不写代码,架构师整天在干啥?
- 毕业那天我们一起失恋
- EditPlus文本编辑器,中文与破解实战
- 【毕业季·进击的技术er】大学生计算机毕业设计应该这样写
- 2015.05.05,外语,读书笔记-《Word Power Made Easy》 15 “如何谈论事情进展” SESSION 42...
- 机器学习实战之朴素贝叶斯与垃圾邮件分类