如何正确处理hystrix回退中的预期错误?

Joh*_*han 8 java spring-boot hystrix spring-cloud

我们有一个Hystrix(1.4.x)命令,看起来像这样(使用Spring):

@HystrixCommand(groupKey = "GroupKey", commandKey = "CommandKey", fallbackMethod = "myFallback")
public List<X> findXs(long xId) {
   return externalService.findXsExternally(xId);
}
Run Code Online (Sandbox Code Playgroud)

我们实际上不希望List从fallback方法返回一个(空),而是抛出一个异常,以便我们的调用者findXs知道它externalService已经关闭并且可以相应地采取行动.但与此同时,我们希望利用Hystrix提供的功能.在我们的例子中,我们希望调用者返回错误消息而不是返回列表.在Spring中,后备实现如下:

public List<X> myFallback(long xId) {
    // What to do?? Throw exception!?  
}
Run Code Online (Sandbox Code Playgroud)

myFallback"作品"中抛出异常,但Hystrix会警告我们:

CommandKey失败并且回退失败.

即它会将此解释为后备失败.在我们的情况下,异常应被解释为后备失败而是预期的行为.我们也尝试将抛出的异常包装在一个HystrixBadRequestException但是它似乎不适用于回退(根据文档,这将适用于"运行"方法).

如何在Hystrix中实现异常抛出的回退方法?我们可以安全地忽略警告,还是Hystrix不是这样设计的?

hyn*_*ess 10

如果您不想使用它,为什么要设置后备?Hystrix不要求你设置一个.当你宁愿从缓存中返回陈旧数据而不是抛出异常时,会使用回退.两种情况都算作Hystrix的失败.如果你要从fallback方法中抛出异常,你只会混淆Hystrix,除了服务本身之外,Hystrix会认为你的后备有错误.如果您不提供回退,Hystrix应该抛出一个HystrixBadRequestException来包装从您的findXs方法抛出的异常.