Spring Cloud Circuit Breaker 使用示例
- 2022 年 11 月 18 日
- 筆記
- resilience4j, spring, Spring Cloud, 微服務
Spring Cloud Circuit Breaker 使用示例
作者: Grey
原文地址:
部落格園:Spring Cloud Circuit Breaker 使用示例
CSDN:Spring Cloud Circuit Breaker 使用示例
說明
Spring Cloud Circuit breaker提供了一個跨越不同斷路器實現的抽象。它提供了一個一致的API,可以在你的應用程式中使用,允許你的開發者選擇最適合你的應用程式需求的斷路器實現。
它還支援的實現有如下幾種
完整程式碼
spring-cloud-circuit-breaker-usage
環境
-
JDK 1.8+
-
Maven 3.5+
-
Spring Boot 版本:2.7.5
-
Spring Cloud 版本:2021.0.5
項目結構和說明
- spring-cloud-circuit-breaker-usage:父項目名稱
- server : 服務端端模組
- src/
- pom.xml
- client : 客戶端模組
- src/
- pom.xml
- pom.xml:父項目 pom 配置
- server : 服務端端模組
程式碼說明
服務端需要引入如下依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
然後暴露一個簡單服務
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;
@RestController
public class BookController {
@RequestMapping(value = "/recommended")
public Mono<String> readingList() {
return Mono.just("book1,book2,book3");
}
}
暴露埠
server.port=8090
客戶端的配置也很簡單,核心在ReactiveCircuitBreaker
的初始化,客戶端的依賴如下
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class BookService {
private static final Logger LOG = LoggerFactory.getLogger(BookService.class);
private final WebClient webClient;
private final ReactiveCircuitBreaker readingListCircuitBreaker;
public BookService(ReactiveCircuitBreakerFactory circuitBreakerFactory) {
this.webClient = WebClient.builder().baseUrl("//localhost:8090").build();
this.readingListCircuitBreaker = circuitBreakerFactory.create("recommended");
}
public Mono<String> readingList() {
return readingListCircuitBreaker.run(webClient.get().uri("/recommended").retrieve().bodyToMono(String.class), throwable -> {
LOG.warn("Error making request to book service", throwable);
return Mono.just("local store book");
});
}
}
如果需要配置一些熔斷條件,則做如下設置即可
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofMillis(1000))
.slidingWindowSize(2)
.build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(4))
.build();
this.readingListCircuitBreaker = circuitBreakerFactory.configureDefault(
id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
客戶端暴露一個介面用於測試
@RestController
public class ReadingController {
private final BookService bookService;
public ReadingController(BookService bookService) {
this.bookService = bookService;
}
@RequestMapping("/to-read")
public Mono<String> toRead() {
return bookService.readingList();
}
}
客戶端設置埠
server.port=8080
接下來,啟動服務端,然後啟動客戶端,用 Postman 或者其他相關工具訪問: //localhost:8080/to-read
然後把服務端停止,模擬服務中斷,再次訪問: //localhost:8080/to-read
顯示了降級後的內容。
參考文檔
spring-cloud-circuitbreaker-demo
Spring Cloud Circuit Breaker Guide
Quick Guide to Spring Cloud Circuit Breaker