title: Resilience4j熔断器Circuit Breaker date: 2023-05-31
从这一篇起我们将来讲述 Resilience4j熔断器的使用spring中如何使用以及背后的原理(当然要结合源码来探讨)。
任何组件都会有配置 可以说配置是一个组件的基础 无法绕过它。例如我们前面说的Archaius作为NetflixOss的配置基础 Hystrix 、Ribbon都是在其基础上进行扩展的 ,可以说它在整个NetflixOss中扮演者重要的角色。 而今天我们的主角的配置功能不像Archaius那么复杂 需要专门拿专栏来讲述。
CircuitBreakerConfig.ofDefaults();
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.slidingWindowSize(10)
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.build();
CircuitBreakerConfig.custom()
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.slidingWindowSize(10)
.automaticTransitionFromOpenToHalfOpenEnabled(true)
.currentTimestampFunction( clock -> clock.millis() , TimeUnit.MILLISECONDS)
.failureRateThreshold(0.1f)
.ignoreException(throwable -> {
if (throwable instanceof NullPointerException){
return false;
}
return true;
})
.maxWaitDurationInHalfOpenState(Duration.ofSeconds(60))
.minimumNumberOfCalls(1)
.slowCallDurationThreshold(Duration.ofSeconds(60))
.slowCallRateThreshold(0.1f)
.waitDurationInOpenState(Duration.ofMinutes(1)).build();
上面说了那么多的配置 那么这些配置到底是怎么使用的。我们通过一个demo先展示一下。
given(helloWorldService.returnHelloWorld()).willReturn("hello word");
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.slidingWindowSize(10)
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.build();
CircuitBreaker circuitBreaker = CircuitBreaker.of("test", circuitBreakerConfig);
Supplier<String> stringSupplier = circuitBreaker.decorateSupplier(helloWorldService::returnHelloWorld);
assertThat(stringSupplier.get()).isEqualTo("hello word");
断路器的配置到这就结束了。上面一坨的配置后面用到的时候再回头来查就可以了,无需死记。Resilience4j属于轻量级的框架 本身并没有依赖专门的配置工具,自己实现的配置也是相当的简单。值得注意的是Resilience4j每一个模块都会有自己的配置 这些配置是相互独立的。例如:重试功能的配置 RateLimiterConfig 、限流模块的配置 RateLimiterConfig 等等。这些我们后面遇到的时候就不再花时间介绍了。相对于熔断的配置 其他模块的配置还算简单。