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

Posted 程序猿DD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hystrix降级逻辑中如何获取触发的异常?相关的知识,希望对你有一定的参考价值。

通过之前Spring Cloud系列教程中的一文,我们已经知道如何通过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.  

……

  • Spring系列:


……

深入交流、更多福利

扫码加入我的知识星球

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

以上是关于Hystrix降级逻辑中如何获取触发的异常?的主要内容,如果未能解决你的问题,请参考以下文章

8.Spring-Cloud-Hystrix之异常处理

服务治理-Hystrix触发fallback降级逻辑的5种情况

SpringCloud---熔断降级理解Hystrix实战

对SpringCloud Hystrix服务降级的浅显理解

Hystrix失败处理逻辑解析

如何说 Hystrix 不会为 Hystrix 命令中的某些异常触发回退