Java 断路器设计模式的实现
我曾尝试使用Spring框架在Java中实现断路器模式,但没有成功 如何通过Java和Spring实现断路器模式?关于模式本身 您可以在以下位置获得有关此模式的许多有用信息。它包含ruby实现以及其他语言实现的参考 关于JavaSpring实现 请检查一下电话号码。Java 断路器设计模式的实现,java,spring,design-patterns,Java,Spring,Design Patterns,我曾尝试使用Spring框架在Java中实现断路器模式,但没有成功 如何通过Java和Spring实现断路器模式?关于模式本身 您可以在以下位置获得有关此模式的许多有用信息。它包含ruby实现以及其他语言实现的参考 关于JavaSpring实现 请检查一下电话号码。 它包含spring中的断路器实现以及其他设计模式。提供了与的一些有趣的集成。您可能应该对此进行研究…以获得一个简单、直接的检查。例: 没有变得更简单。使用Hystrix实际上不需要使用Spring cloud或Spring boot
它包含spring中的断路器实现以及其他设计模式。提供了与的一些有趣的集成。您可能应该对此进行研究…以获得一个简单、直接的检查。例:
没有变得更简单。使用Hystrix实际上不需要使用Spring cloud或Spring boot。
使用Hystrix也可以轻松地将其与普通旧弹簧一起使用 以下是回退方法的示例(getMessageTimeout和getMessageException这两种方法都是默认失败的):
@配置
@组件扫描
@促性腺激素
使用Hystrix的公共级断路器{
@豆子
公共HYSTRIXCOMMANDSPECT HYSTRIXSPECT(){
返回新的HYSTRIxCommandSpect();
}
公共静态void main(字符串[]args)抛出可丢弃的{
ApplicationContext ctx
=新的AnnotationConfigApplicationContext(CircuitBreakingWithyStrix.class);
ExampleService ex=ctx.getBean(ExampleService.class);
对于(int i=0;i<1000;i++){
System.out.println(例如getMessageException());
System.out.println(例如getMessageTimeout());
}
}
@服务
类示例服务{
/*
*默认的Hystrix超时是1秒
*此方法的版本将始终失败。
*添加@HystrixProperty将导致
*成功的方法。
*/
@HystrixCommand(
commandProperties={
//@HystrixProperty(名称=执行\u隔离\u线程\u超时\u毫秒,
//value=“5000”)
},
fallbackMethod=“messageFallback”
)
公共字符串getMessageTimeout(){
试一试{
//暂停4秒钟
睡眠(4000);
}捕获(中断异常例外){
//用这个做点聪明的事
}
返回“结果”;
}
@HystrixCommand(
fallbackMethod=“messageFallback”)
公共字符串getMessageException(){
抛出新的RuntimeException(“发生了不好的事情”);
}
私有字符串消息回退(可丢弃的hre){
返回“回退”;
}
}
您还可以检查发送到回退方法的可丢弃项,以确定方法调用失败的原因。您可以查看一下。那里的实现实现了类似断路器的方法
请注意,这不是模式的1:1实现,因为它没有定义“半开”等固定状态。相反,它根据当前应用状态(使用所谓的“断路器策略”)做出决定(如果断路器应该打开或关闭)。不过,应该可以定义这样的“断路器策略”它评估故障阈值-因此也可以使用JCircuitBreaker实现原始模式。对几种类型的轻型断路器有一些实现,下面是
该项目提供了EventCountCircuitBreaker
和ThresholdCircuitBreaker
类,以及一个抽象的AbstractCircuitBreaker
,因此您可以实现自己的
代码是开源的,因此任何试图实现该模式的人都应该至少看一眼。Hi,是否有任何具体的断路器实现,用于任何一起使用java和spring的web服务。感谢您的快速响应,我浏览了JRugged库,它很好,但是可以看到它非常庞大,但我需要立即使用断路器参加紧急情况,并因此寻找任何简单的弹簧解决方案。请建议和分享请缩短身体。展示您对工作的承诺和最初的尝试。最后提出明确的问题。使用适当的标签。您在退步中做了什么?
CircuitBreaker breaker = new CircuitBreaker()
.withFailureThreshold(5)
.withSuccessThreshold(3)
.withDelay(1, TimeUnit.MINUTES);
Failsafe.with(breaker).run(() -> connect());
@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";
}
}