介紹Spring Cloud斷路器

banq發表於2019-04-17

當使用微服務架構來構建我們的應用程式時,在服務中最終會得到一個非常複雜的依賴樹。如果依賴關係樹中的服務遇到導致其開始緩慢響應的問題,則最終會形成一系列問題,這些問題會使依賴關係樹級聯起來。隨著越來越多的請求進入應用程式,等待慢速服務響應可能會消耗越來越多的資源。更糟糕的是,對慢速服務施加的額外負載可能會加劇問題。為了幫助減輕這些型別的級聯故障的影響,通常的做法是使用斷路器作為微服務應用的一部分。
Spring Cloud 允許開發人員使用Netflix Hystrix作為Spring Cloud Netflix專案的一部分,為其應用新增斷路器。除了Hystrix之外,Spring Cloud開發人員可能還想使用其他斷路器實現。為了幫助Spring Cloud開發人員以一致的方式為其應用程式新增斷路器,我們引入了Spring Cloud Circuit Breaker專案作為Spring Cloud孵化器的一部分。
Spring Cloud Circuit Breaker專案提供了一個抽象API,用於為您的應用新增斷路器。在本博文釋出時,有四種支援的實現:


要使用想要指定的實現,請將適當的啟動器新增到應用程式的類路徑中。

使用Spring Cloud斷路器
目前,Spring Cloud Circuit Breaker不是Spring Cloud BOM的一部分,僅釋出到我們的快照倉庫。您需要將我們的快照倉庫新增到Maven或Gradle檔案中。以下示例使用Maven:

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <name>Spring Snapshots</name>
        <url>https://repo.spring.io/libs-snapshot-local</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
        <releases>
            <enabled>false</enabled>
        </releases>
    </repository>
</repositories>


接下來,您需要將Spring Cloud Circuit Breaker依賴項新增到您的應用程式中。同樣,以下示例使用Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>
            spring-cloud-starter-circuitbreaker-resilience4j
       </artifactId>
        <version>0.0.1.BUILD-SNAPSHOT</version>
    </dependency>
</dependencies>


Spring Cloud Circuit Breaker CircuitBreakerFactory根據應用程式類路徑上的啟動器自動配置實現。然後,您可以將此介面注入到所需的任何類中。以下示例顯示瞭如何執行此操作:

@Service
public static class DemoControllerService {
    private RestTemplate rest;
    private CircuitBreakerFactory cbFactory;

    public DemoControllerService(RestTemplate rest, 
                CircuitBreakerFactory cbFactory) {
        this.rest = rest;
        this.cbFactory = cbFactory;
    }

    public String slow() {
        return cbFactory.create("slow").run(() -> 
                rest.getForObject("/slow", String.class),
                throwable -> "fallback");
    }
}

大多數實現還支援Reactive API。目前,Spring Retry是唯一的沒有反應式實現。如果要在斷路器中包含一些代反應式碼,則需要使用ReactiveCircuitBreakerFactory。以下示例顯示瞭如何執行此操作:

@Service
public static class DemoControllerService {
    private ReactiveCircuitBreakerFactory cbFactory;
    private WebClient webClient;


    public DemoControllerService(WebClient webClient, 
                ReactiveCircuitBreakerFactory cbFactory) {
        this.webClient = webClient;
        this.cbFactory = cbFactory;
    }

    public Mono<String> slow() {
        return webClient.get().uri("/slow").retrieve()
                .bodyToMono(String.class).transform(it -> {
            CircuitBreaker cb = cbFactory.create("slow");
            return cb.run(it, throwable -> 
                            Mono.just("fallback"));
                });
    }
}

配置斷路器
在大多數情況下,您將需要配置斷路器的行為。為此,您可以建立型別的bean Customizer。Spring Cloud斷路器允許您為所有斷路器提供預設配置以及特定斷路器的配置。例如,要在使用Resilience4J時為所有斷路器提供預設配置,您可以將以下bean新增到配置類:

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(
            id -> new Resilience4JConfigBuilder(id)
            .timeLimiterConfig(TimeLimiterConfig.custom()
                .timeoutDuration(Duration.ofSeconds(4)).build())
            .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .build());
}

配置單個斷路器的程式碼和上面看起來非常相似,另外您需要在Customizer其中提供斷路器ID ,如下所示:

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> {
        return builder
            .timeLimiterConfig(TimeLimiterConfig.custom()
                            .timeoutDuration(Duration.ofSeconds(2)).build())
            .circuitBreakerConfig(
                            CircuitBreakerConfig.ofDefaults());
    }, "slow");
}


我們期待聽到您對這個新專案的看法。檢視GitHub專案以及文件以獲取更多資訊。與往常一樣,您可以透過Stack OverflowGitter或透過建立GitHub問題與我們聯絡
 

相關文章