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