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

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

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

[[236808]]

注解方式

先介绍一下用注解方式定义的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"); 

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

继承方式

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

  1. public static class UserCommand extends HystrixCommand<User> { 
  2.  
  3.     protected UserCommand() { 
  4.         super(HystrixCommandGroupKey.Factory.asKey("UserCommand")); 
  5.     } 
  6.  
  7.     @Override 
  8.     protected User run() throws Exception { 
  9.         throw new RuntimeException("getUserById command failed"); 
  10.     } 
  11.  
  12.     @Override 
  13.     protected User getFallback() { 
  14.         System.out.println(getFailedExecutionException().getMessage()); 
  15.         return new User("def""def"); 
  16.     } 
  17.  

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

总结

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

【本文为51CTO专栏作者“翟永超”的原创稿件,转载请通过51CTO联系作者获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2017-07-03 09:50:07

Spring Clou微服务架构

2018-06-11 08:50:46

LinuxArch Linux降级软件包

2023-01-02 11:34:04

LinuxFlatpak软件包

2021-09-28 09:16:43

SQLancerDBMS逻辑漏洞

2023-03-09 12:21:38

2009-03-18 08:59:28

throw异常Java

2019-03-08 11:00:32

BashLinux

2023-05-30 07:56:23

代码软件开发

2019-07-25 12:37:08

程序员技能开发者

2015-07-30 10:12:32

JavaNullAssert

2024-03-14 08:13:08

BFCWeb机制

2012-07-26 10:29:55

Linux操作系统

2022-07-21 09:31:58

Actuator密码框架

2021-06-05 05:11:52

代码状态机逻辑

2021-10-06 19:01:45

高并发熔断预热

2009-08-25 11:13:28

C#获取逻辑硬盘信息

2020-10-09 11:15:14

LinuxLVM逻辑卷管理

2017-06-21 12:22:33

2023-01-31 14:00:01

TIAPUUID

2017-12-01 08:54:18

SpringCloudHystrix
点赞
收藏

51CTO技术栈公众号