Spring Cloud Circuit Breaker 使用示例

Spring Cloud Circuit Breaker 使用示例

作者: Grey

原文地址:

博客園:Spring Cloud Circuit Breaker 使用示例

CSDN:Spring Cloud Circuit Breaker 使用示例

說明

Spring Cloud Circuit breaker提供了一個跨越不同斷路器實現的抽象。它提供了一個一致的API,可以在你的應用程序中使用,允許你的開發者選擇最適合你的應用程序需求的斷路器實現。

它還支持的實現有如下幾種

Resilience4j

Hystrix

Sentinel

Spring Retry

完整代碼

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 配置

代碼說明

服務端需要引入如下依賴

        <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("http://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 或者其他相關工具訪問: http://localhost:8080/to-read

image

然後把服務端停止,模擬服務中斷,再次訪問: http://localhost:8080/to-read

image

顯示了降級後的內容。

參考文檔

Spring Cloud Circuit Breaker

spring-cloud-circuitbreaker-demo

Spring Cloud Circuit Breaker Guide

Quick Guide to Spring Cloud Circuit Breaker

spring-retry

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章