領先一步
VMware 提供培訓和認證,以加速您的進度。
了解更多當使用微服務架構來建構我們的應用程式時,最終往往會遇到服務之間相當複雜的依賴樹。如果依賴樹中的服務遇到問題,導致它開始緩慢回應,最終會導致一系列問題向上層疊加。隨著越來越多的請求進入應用程式,越來越多的資源可能會被等待緩慢服務回應所消耗。更糟的是,施加在緩慢服務上的額外負載可能會加劇問題。為了幫助減輕這些級聯故障的影響,通常的做法是使用 斷路器 作為微服務應用程式的一部分。
Spring Cloud 已經 讓開發人員透過使用 Netflix Hystrix 作為 Spring Cloud Netflix 專案 的一部分,將斷路器加入他們的應用程式中。除了 Hystrix 之外,Spring Cloud 開發人員可能還想使用其他的斷路器實作。為了幫助 Spring Cloud 開發人員以一致的方式將斷路器加入他們的應用程式中,我們引入了 Spring Cloud Circuit Breaker 專案,作為 Spring Cloud incubator 的一部分。
Spring Cloud Circuit Breaker 專案提供了一個抽象 API,用於將斷路器加入您的應用程式。在撰寫此部落格文章時,有四種受支援的實作:
要使用給定的實作,請將適當的 starter 加入您應用程式的 classpath。
目前,Spring Cloud Circuit Breaker 不是 Spring Cloud BOM 的一部分,僅發布到我們的 snapshot repo。您需要將我們的 snapshot repo 加入您的 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 會根據您應用程式 classpath 上的 starter 自動配置 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");
}
}
大多數實作也支援反應式 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"));
});
}
}
在大多數情況下,您會想要配置斷路器的行為。為此,您可以建立 Customizer
類型的 bean。Spring Cloud Circuit Breaker 允許您為所有斷路器提供預設配置,以及針對特定斷路器的配置。例如,要在使用 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 Overflow 和 Gitter 與我們聯繫,或建立 GitHub issue。