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

经过以前Spring Cloud系列教程中的《Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)》一文,咱们已经知道如何经过Hystrix来保护本身的服务不被外部依赖方拖垮的状况。可是实际使用过程当中常常碰到开发反应“莫名”触发了降级逻辑的状况。为了更精准的定位触发缘由,或是在降级逻辑中须要根据不一样的异常作不一样的处理时,在降级方法中,咱们但愿能够获取到主逻辑中抛出的异常信息。接下来就来介绍一下Hystrix两种不一样实现方式中如何在降级逻辑中获取异常信息的方法。java

注解方式

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

@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。经过这样的简单定义,开发人员就能够很方便的获取触发降级逻辑的异常信息,用做日志记录或者其它复杂的业务逻辑了。架构

继承方式

在继承方式中要获取触发异常也很是简单,具体以下:ide

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由服务提供方抛出的异常在消费方没能考虑周到,会触发一些意料以外的降级。因此在降级逻辑中,建议每一段都加入触发异常的日志记录,以方便定位问题缘由。微服务

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

相关文章
相关标签/搜索