Java 断路器设计模式的实现

Java 断路器设计模式的实现,java,spring,design-patterns,Java,Spring,Design Patterns,我曾尝试使用Spring框架在Java中实现断路器模式,但没有成功 如何通过Java和Spring实现断路器模式?关于模式本身 您可以在以下位置获得有关此模式的许多有用信息。它包含ruby实现以及其他语言实现的参考 关于JavaSpring实现 请检查一下电话号码。 它包含spring中的断路器实现以及其他设计模式。提供了与的一些有趣的集成。您可能应该对此进行研究…以获得一个简单、直接的检查。例: 没有变得更简单。使用Hystrix实际上不需要使用Spring cloud或Spring boot

我曾尝试使用Spring框架在Java中实现断路器模式,但没有成功

如何通过Java和Spring实现断路器模式?

关于模式本身 您可以在以下位置获得有关此模式的许多有用信息。它包含ruby实现以及其他语言实现的参考

关于JavaSpring实现 请检查一下电话号码。
它包含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";
    }

  }