# 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} ```