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方法抛出的异常.
| 归档时间: |
|
| 查看次数: |
7077 次 |
| 最近记录: |