我尝试使用Spring框架在Java中实现断路器模式here失败。
如何通过Java和Spring实现断路器模式?
答案 0 :(得分:10)
对于简单明了的circuit breaker implementation,请查看Failsafe。例如:
CircuitBreaker breaker = new CircuitBreaker()
.withFailureThreshold(5)
.withSuccessThreshold(3)
.withDelay(1, TimeUnit.MINUTES);
Failsafe.with(breaker).run(() -> connect());
没有那么简单。
答案 1 :(得分:5)
http://example.net/user/123/values有几种轻量级断路器的实现,这里是Apache commons
该项目提供了ThresholdCircuitBreaker
和AbstractCircuitBreaker
类,以及一个抽象的ICollection
,因此您可以实现自己的类。
代码是开放源代码并且是a link to the docs,因此任何试图实现该模式的人都应该至少看一眼。
答案 2 :(得分:3)
Spring cloud提供了与Hystrix的有趣集成。你可能应该看看它......
答案 3 :(得分:1)
您可以在Martin Fowler's blog获取有关此模式的大量有用信息。它包含ruby实现以及其他语言实现的参考。
请检查JRugged library。 它包含Spring中的Circuit Breaker实现以及其他设计模式。
答案 4 :(得分:1)
您实际上不需要使用Spring云或Spring启动来使用Hystrix 使用hystrix-javanica可以很容易地使用Hystrix和普通的Spring。
以下是回退方法的示例(默认情况下,这两个方法,getMessageTimeout和getMessageException都失败):
@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";
}
}
您还可以检查发送到回退方法的throwable,以确定方法调用失败的原因。
答案 5 :(得分:0)
您可以查看JCircuitBreaker。那里的实现实现了类似断路器的方法。
请注意,这不是模式的1:1实现,因为它没有定义像“半开”这样的固定状态。相反,它根据当前的应用状态(使用所谓的“中断策略”)做出决定(如果断路器应该打开或关闭)。尽管如此,应该可以定义一个评估故障阈值的“中断策略” - 因此应该可以使用JCircuitBreaker实现原始模式。