diff --git a/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md b/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md new file mode 100644 index 0000000..7b6b55f --- /dev/null +++ b/spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md @@ -0,0 +1,111 @@ +# CircuitBreaker +resilience4j是一个轻量级的fault tolerance library,其针对函数式编程进行设计。resilence4j提供了更高阶的函数(`decorator`)来对`function interface, lambda expression, method reference`等内容进行增强。 + +decorators包含如下分类: +- CircuitBreaker +- Rate Limiter +- Retry +- Bulkhead + +对于任何`function interface, lambda expression, method reference`,都可以使用多个decorators进行装饰。 + +## Introduction +在如下示例中,会展示如何通过CircuitBreaker和Retry来对lambda expression进行装饰,令lambda在发生异常时最多重试3次。 + +可以针对多次retry之间的interval进行配置,也支持自定义的backoff algorithm。 + +```java +// Create a CircuitBreaker with default configuration +CircuitBreaker circuitBreaker = CircuitBreaker + .ofDefaults("backendService"); + +// Create a Retry with default configuration +// 3 retry attempts and a fixed time interval between retries of 500ms +Retry retry = Retry + .ofDefaults("backendService"); + +// Create a Bulkhead with default configuration +Bulkhead bulkhead = Bulkhead + .ofDefaults("backendService"); + +Supplier supplier = () -> backendService + .doSomething(param1, param2) + +// Decorate your call to backendService.doSomething() +// with a Bulkhead, CircuitBreaker and Retry +// **note: you will need the resilience4j-all dependency for this +Supplier decoratedSupplier = Decorators.ofSupplier(supplier) + .withCircuitBreaker(circuitBreaker) + .withBulkhead(bulkhead) + .withRetry(retry) + .decorate(); + +// When you don't want to decorate your lambda expression, +// but just execute it and protect the call by a CircuitBreaker. +String result = circuitBreaker + .executeSupplier(backendService::doSomething); + +// You can also run the supplier asynchronously in a ThreadPoolBulkhead + ThreadPoolBulkhead threadPoolBulkhead = ThreadPoolBulkhead + .ofDefaults("backendService"); + +// The Scheduler is needed to schedule a timeout +// on a non-blocking CompletableFuture +ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3); +TimeLimiter timeLimiter = TimeLimiter.of(Duration.ofSeconds(1)); + +CompletableFuture future = Decorators.ofSupplier(supplier) + .withThreadPoolBulkhead(threadPoolBulkhead) + .withTimeLimiter(timeLimiter, scheduledExecutorService) + .withCircuitBreaker(circuitBreaker) + .withFallback(asList(TimeoutException.class, + CallNotPermittedException.class, + BulkheadFullException.class), + throwable -> "Hello from Recovery") + .get().toCompletableFuture(); +``` +## maven +resilence4j需要jdk17及以上,如果使用maven,可以按照如下方式来引入 + +引入所有包的方式如下 +```xml + + io.github.resilience4j + resilience4j-all + ${resilience4jVersion} + +``` + +按需引入方式如下 +```xml + + io.github.resilience4j + resilience4j-circuitbreaker + ${resilience4jVersion} + + + io.github.resilience4j + resilience4j-ratelimiter + ${resilience4jVersion} + + + io.github.resilience4j + resilience4j-retry + ${resilience4jVersion} + + + io.github.resilience4j + resilience4j-bulkhead + ${resilience4jVersion} + + + io.github.resilience4j + resilience4j-cache + ${resilience4jVersion} + + + io.github.resilience4j + resilience4j-timelimiter + ${resilience4jVersion} + +``` \ No newline at end of file