如何在Resilience4J中实现具有相同配置的多个断路器

时间:2020-05-11 16:49:40

标签: resilience4j

我是Resilience4J的新手,正在尝试与Spring boot集成。

我的应用程序有几个远程系统调用。我希望所有远程呼叫都使用相同的断路器配置。

我正在使用java配置和使用resilience4J运算符修饰远程调用的功能样式。目前,我为所有远程系统调用定义了一个断路器和一个重试bean。

@Bean
    public CircuitBreakerConfig circuitBreakerConfig() {
        return CircuitBreakerConfig.custom().slidingWindowType(SlidingWindowType.COUNT_BASED).slidingWindowSize(6)
                .failureRateThreshold(50).waitDurationInOpenState(Duration.ofSeconds(10))
                .permittedNumberOfCallsInHalfOpenState(3).recordExceptions(HttpClientErrorException.class, HttpServerErrorException.class,TimeoutException.class,SdkClientException.class,AmazonServiceException.class,SQLException.class,JDBCException.class, DataAccessException.class).build();
    }

    @Bean
    public CircuitBreaker circuitBreaker(CircuitBreakerConfig circuitBreakerConfig) {
        return CircuitBreaker.of("circuit-config", circuitBreakerConfig);
    }

    @Bean
    public RetryConfig retryConfig() {
        return RetryConfig.custom().maxAttempts(3).waitDuration(Duration.ofMillis(1000))
                .retryExceptions(HttpClientErrorException.class, HttpServerErrorException.class,TimeoutException.class,SdkClientException.class,AmazonServiceException.class,SQLException.class,JDBCException.class, DataAccessException.class).build();
    }

    @Bean
    public Retry retry() {
        return Retry.of("retry-config", retryConfig());
    }

Decorators.ofRunnable(systemA::callA)
            .withCircuitBreaker(circuitBreaker)
            .withRetry(retry)
            .decorate()
            .run();

Decorators.ofRunnable(systemB::callB)
            .withCircuitBreaker(circuitBreaker)
            .withRetry(retry)
            .decorate()
            .run();

但是我发现以这种方式在系统A和系统B之间共享断路器(及其内部环形缓冲区)。由于这个原因,一个远程系统的故障影响了另一个远程系统的故障阈值。

我需要为每个远程系统配备一个单独的断路器,以便每个远程系统都可以维护故障阈值。但是在远程系统中,电路烧杯的配置仍然相同。

实现此目标的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

您应该使用Spring Boot 2 Starter和外部配置。 然后将CircuitBreakerRegistry注入您的代码或使用注释。