Hystrix降级逻辑中如何获取触发的异常?
通过之前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
函数中的最后一个传参 Throwablethrowable
。通过这样的简单定义,开发人员就可以很方便的获取触发降级逻辑的异常信息,用作日志记录或者其它复杂的业务逻辑了。
继承方式
在继承方式中要获取触发异常也非常简单,具体如下:
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由服务提供方抛出的异常在消费方没能考虑周到,会触发一些意料之外的降级。所以在降级逻辑中,建议每一段都加入触发异常的日志记录,以方便定位问题原因。
- END -
往期推荐:
死磕Java系列:
深入分析ThreadLocal
深入分析synchronized的实现原理
深入分析volatile的实现原理
Java内存模型之happens-before
Java内存模型之重排序
Java内存模型之分析volatile
Java内存模型之总结
J.U.C之AQS简介
J.U.C之AQS:CLH同步队列
J.U.C之AQS同步状态的获取与释放
J.U.C之AQS阻塞和唤醒线程
J.U.C之重入锁:ReentrantLock
J.U.C之读写锁:ReentrantReadWriteLock
J.U.C之Condition
J.U.C之并发工具类:CyclicBarrier
J.U.C之并发工具类:Semaphore
J.U.C之并发工具类:CountDownLatch
J.U.C之并发工具类:Exchanger
……
Spring系列:
Spring Cloud Zuul中使用Swagger汇总API接口文档
Spring Cloud Config Server迁移节点或容器化带来的问题
Spring Cloud Config对特殊字符加密的处理
Spring Boot使用@Async实现异步调用:使用Future以及定义超时
Spring Cloud构建微服务架构:分布式配置中心(加密解密)
Spring Boot快速开发利器:Spring Boot CLI
……
可关注我的公众号
深入交流、更多福利
扫码加入我的知识星球
点击“阅读原文”,看本号其他精彩内容
Hystrix降级逻辑中如何获取触发的异常?相关推荐
- Hystrix降级逻辑中如何获取触发的异常
通过之前Spring Cloud系列教程中的<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>一文,我们已经知道如何通过Hystrix来保护自己的服务不被外 ...
- Hystrix降级逻辑中如何获取触发的异常 1
通过之前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 ...
最新文章
- 正确的WordPress文件权限[关闭]
- 认认真真推荐9个值得关注的公众号
- 如何利用CycleGAN实现男女性别转换
- 9于word没有注册类_XPage系列这次升级后终于是全自动化注册了!
- 客观地认识程序员心中的恐惧
- html5中在canvas上绘图
- [hackinglab][CTF][综合关][2020] hackinglab 综合关 writeup
- 开源SUP对接API卡盟程序卡信乐v2.0源码
- 程序员疫苗:代码注入
- mysql常量求和_Mysql之:count(*)、count(常量)、count(字段)的区别
- jdbc 连接阿里云mysql数据库_java jdbc连接数据库
- Windows 生成ffmpeg安卓全平台so
- 赤兔oracle恢复软件 收费,赤兔Oracle数据库恢复软件下载 v11.6官方版-下载啦
- 获取深户股市列表api_获取股票api
- 横沥东莞注塑工艺需要考虑的7个因素
- 从MIXMAX概率模型理解Bayesian建模方法
- MxN螺旋矩阵(由外向内)
- 关于将微信小程序部署到云服务器上的具体步骤
- MD5单向散列算法详解
- 项目管理协会(PMI)人才三角
热门文章
- linux 功能测试宏 POSIX_C_SOURCE
- linux 内核 同步机制
- Linux ps命令详解与示例说明
- 关于windowsx.h的介绍
- http抓包工具推荐WSockExpert/httpwatch/HttpAnalyzer/DebugBar
- Linux内核探讨-- 第五章
- 对网上花店系统进行软件测试,网上花店系统
- c++ 缓存和缓冲_【嵌入式C】放弃printf,选择了精简snprintf
- linux发布java网站_Linux下部署java web项目
- 3 账套升级u8_用友U8条码管理的应用对仓库有什么好处?