Apache commons为几种类型的轻量级断路器提供了一些实现,下面是a link to the docs 该项目提供了EventCountCircuitBreaker和ThresholdCircuitBreaker类,以及一个抽象的AbstractCircuitBreaker,因此您可以实现自己的类。 代码是开源的,并且是hosted at github,所以任何试图实现该模式的人至少应该看一眼。
@Configuration
@ComponentScan
@EnableAspectJAutoProxy
public class CircuitBreakingWithHystrix {
@Bean
public HystrixCommandAspect hystrixAspect() {
return new HystrixCommandAspect();
}
public static void main(String[] args) throws Throwable {
ApplicationContext ctx
= new AnnotationConfigApplicationContext(CircuitBreakingWithHystrix.class);
ExampleService ex = ctx.getBean(ExampleService.class);
for (int i = 0; i < 1000; i++) {
System.out.println(ex.getMessageException());
System.out.println(ex.getMessageTimeout());
}
}
@Service
class ExampleService {
/*
* The default Hystrix timeout is 1 second. So the default
* version of this method will always fail.
* Adding the @HystrixProperty will cause
* the method to succeed.
*/
@HystrixCommand(
commandProperties = {
//@HystrixProperty(name = EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,
// value = "5000")
},
fallbackMethod = "messageFallback"
)
public String getMessageTimeout() {
try {
//Pause for 4 seconds
Thread.sleep(4000);
} catch (InterruptedException ex) {
// Do something clever with this
}
return "result";
}
@HystrixCommand(
fallbackMethod = "messageFallback")
public String getMessageException() {
throw new RuntimeException("Bad things happened");
}
private String messageFallback(Throwable hre) {
return "fallback";
}
}
7条答案
按热度按时间rkkpypqq1#
要获得一个简单明了的断路器实现,请查看Failsafe(我编写的)。
这可不简单。
ecfdbz9o2#
Apache commons为几种类型的轻量级断路器提供了一些实现,下面是a link to the docs
该项目提供了
EventCountCircuitBreaker
和ThresholdCircuitBreaker
类,以及一个抽象的AbstractCircuitBreaker
,因此您可以实现自己的类。代码是开源的,并且是hosted at github,所以任何试图实现该模式的人至少应该看一眼。
q5lcpyga3#
Spring cloud提供了一些有趣的与Hystrix的集成。您可能应该研究一下它...
mv1qrgav4#
关于模式本身
你可以在Martin Fowler's blog上获得很多关于这个模式的有用信息,它包含了ruby实现以及其他语言实现的参考。
关于java spring实现
请检查JRugged library。它包含了Spring中的Circuit Breaker实现以及其他设计模式。
col17t5w5#
您实际上不需要使用Spring云或Sping Boot 来使用Hystrix。
使用hystrix-javanica可以很容易地将Hystrix与普通的老Spring一起使用。
以下是回退方法的示例(默认情况下,getMessageTimeout和getMessageException这两个方法都失败):
您还可以检查发送给回退方法的throwable,以确定方法调用失败的原因。
l7wslrjt6#
你可以看看JCircuitBreaker,它的实现类似于断路器。
请注意,这不是模式的1:1实现,因为它没有定义“半开”等固定状态。相反,它根据当前应用状态(使用所谓的“中断策略”)做出决策(断路器应打开还是关闭)。尽管如此,应该可以定义这样一个评估故障阈值的“中断策略”-因此,也应该可以使用JCircuitBreaker实现原始模式。
niknxzdl7#
Resilience4j也是用于Java的断路器的实现。
您可以使用“断路器”、“重试”。
参考线:https://resilience4j.readme.io/docs/circuitbreaker