java 断路器设计模式实现

baubqpgj  于 2022-12-21  发布在  Java
关注(0)|答案(7)|浏览(257)

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

rkkpypqq

rkkpypqq1#

要获得一个简单明了的断路器实现,请查看Failsafe(我编写的)。

CircuitBreaker breaker = new CircuitBreaker()
  .withFailureThreshold(5)
  .withSuccessThreshold(3)
  .withDelay(1, TimeUnit.MINUTES);

Failsafe.with(breaker).run(() -> connect());

这可不简单。

ecfdbz9o

ecfdbz9o2#

Apache commons为几种类型的轻量级断路器提供了一些实现,下面是a link to the docs
该项目提供了EventCountCircuitBreakerThresholdCircuitBreaker类,以及一个抽象的AbstractCircuitBreaker,因此您可以实现自己的类。
代码是开源的,并且是hosted at github,所以任何试图实现该模式的人至少应该看一眼。

q5lcpyga

q5lcpyga3#

Spring cloud提供了一些有趣的与Hystrix的集成。您可能应该研究一下它...

mv1qrgav

mv1qrgav4#

关于模式本身
你可以在Martin Fowler's blog上获得很多关于这个模式的有用信息,它包含了ruby实现以及其他语言实现的参考。

关于java spring实现

请检查JRugged library。它包含了Spring中的Circuit Breaker实现以及其他设计模式。

col17t5w

col17t5w5#

您实际上不需要使用Spring云或Sping Boot 来使用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,以确定方法调用失败的原因。

l7wslrjt

l7wslrjt6#

你可以看看JCircuitBreaker,它的实现类似于断路器。
请注意,这不是模式的1:1实现,因为它没有定义“半开”等固定状态。相反,它根据当前应用状态(使用所谓的“中断策略”)做出决策(断路器应打开还是关闭)。尽管如此,应该可以定义这样一个评估故障阈值的“中断策略”-因此,也应该可以使用JCircuitBreaker实现原始模式。

niknxzdl

niknxzdl7#

Resilience4j也是用于Java的断路器的实现。
您可以使用“断路器”、“重试”。
参考线:https://resilience4j.readme.io/docs/circuitbreaker

相关问题