doc: 阅读circuit-breaker文档
This commit is contained in:
111
spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md
Normal file
111
spring/Spring Cloud/CircuitBreaker/CircuitBreaker.md
Normal file
@@ -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<String> 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<String> 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<String> 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
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-all</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
|
|
||||||
|
按需引入方式如下
|
||||||
|
```xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-circuitbreaker</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-ratelimiter</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-retry</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-bulkhead</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-cache</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.github.resilience4j</groupId>
|
||||||
|
<artifactId>resilience4j-timelimiter</artifactId>
|
||||||
|
<version>${resilience4jVersion}</version>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user