如何解决HystrixCommand的奇怪行为
该项目使用SpringBoot(2.3.4)
和SpringCloud(Hoxton.SR8)
。
共有三类:BillController,BillService(接口)和BillServiceImpl(实现BillService),BillController调用在BillService中声明的函数getBillList
。
在BillServiceImpl中,有两种方法,一种是getBillList
,另一种是simulateUnstableService
,getBillList
调用simulateUnstableService
,而在simulateUnstableService
中只是很长一段时间睡眠(2000年)。
奇怪的是,如果我用getBillList
对HystrixCommand
进行注释,那么它可以按我期望的那样工作。但是,如果我移动HystrixCommand
来对simulateUnstableService
进行注释,则不会中断,这意味着超时不会触发Circuit Breaker
。
@Service
public class BillServiceImpl implements BillService {
@Override
// have effact
@HystrixCommand(
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
}
)
public List<Bill> getBillList(long userId) {
return simulateUnstableService(userId);
}
// no effact
// @HystrixCommand(
// commandProperties = {
// @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
// }
// )
public List<Bill> simulateUnstableService(long userId) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printstacktrace();
}
return new ArrayList<>();
}
}
还有更多,如果我只是将simulateUnstableService
方法的内容复制到getBillList
,并用HystrixCommand注释getBillList,则断路器也可以工作。
为什么?
解决方法
当电路中断时,调用后备方法。我们需要在hystrix命令中提及回退方法。后备方法的签名与hystrix注释的方法相同。
simulateUnstableService是您的后备方法吗?
@HystrixCommand(fallbackMethod='yourFallbackMethod'
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
}
)
public List<Bill> getBillList(long userId) {
return simulateUnstableService(userId);
}
此外,优良作法是在application.properties文件中添加hystrix命令属性,而不是与注释一起提供。
,很好的问题。
Hystrix 使用 AOP 来包装被调用的方法并提供电路制动功能。实际上有一个方面类 HystrixCommandAspect.java
定义了用于实现此目的的周围建议。
现在,如果您从类中调用方法,AOP 将无法正常工作。请参阅此答案以获得更清晰的信息 - Spring AOP not working for method call inside another method
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。