Spring Cloudインキュベーターは、プラガブルなサーキットブレーカーインターフェースを提供するSpring Cloud Circuit Breakerと呼ばれる新しいプロジェクトを導入した。サーキットブレーカは、超えたときにコードブロックの実行を停止させる一連のしきい値を定義する。これはシステムが早期にエラーを発生し、連鎖的な失敗とシステムの過負荷を防ぐのに役立つ。
Spring Cloud Circuit Breakerプロジェクトは、Javaでよく使われているサーキットブレーカライブラリを抽象化した層である。プロジェクトは現在、Netflix Hystrix、Resilience4j、Sentinel、Spring Retryをサポートしている。
Spring Cloudは、クラウドネイティブの分散システムを構築するために使用できる一般的なツールの集まりである。Spring Cloudは、サービスの登録と発見、ルーティング、ロードバランシング、サーキットブレーカーなどの典型的なユースケースのための機能を提供する。最近まで、Spring Cloudのサーキットブレーカー機能はNetflix Hystrixにのみ依存していた。
新しいSpring Cloud Circuit Breakerプロジェクトでは、開発者はサーキットブレーカーのインターフェースに対してコーディングすることで、他のサーキットブレーカーの実装を柔軟に選択できる。実行時に特定の実装を選択するには、starter JARをアプリケーションのクラスパスに追加する必要がある。
次のスニペットは、商品サービスがCircuitBreakerFactory APIを使用してCircuitBreakerを作成し、CircuitBreaker内で外部レコメンドサービスへの呼び出しをラップする方法を示している。
@Service
public static class ProductsService {
private RestTemplate rest;
private CircuitBreaker circuitBreaker;
public ProductsService(RestTemplate rest, CircuitBreakerFactory cbFactory) {
this.rest = rest;
this.circuitBreaker = cbFactory.create("recs");
}
public ProductList getProducts() {
return circuitBreaker.run(
() -> rest.getForObject("/recs", ProductList.class),
throwable -> "fallback");
}
}
CircuitBreakerのrunメソッドは、Supplierとfallback関数の2つの引数を取りる。Supplierは、CircuitBreaker内で実行ロジックをラップするために使用される。fallback関数は、CircuitBreakerが始動したときに実行されるべきロジックを指定するために使用される。
Spring Cloud Circuit Breakerは、ReactiveCircuitBreakerFactory APIの形式でリアクティブバージョンを提供する。Reactorプロジェクトでビルドされたアプリケーションで使用することができる。これは、外部レコメンドサービスへの呼び出しをラップするために商品サービスがリアクティブバージョンのCircuitBreakerを使用する方法を示すスニペットである。
@Service
public static class ProductsService {
private WebClient webClient;
private ReactiveCircuitBreaker circuitBreaker;
public ProductsService(WebClient webClient,
ReactiveCircuitBreakerFactory cbFactory) {
this.webClient = webClient;
this.circuitBreaker = cbFactory.create("recs");
}
public Mono<ProductList> getProducts() {
return circuitBreaker.run(
webClient
.get()
.uri("/recs")
.retrieve()
.bodyToMono(ProductList.class), throwable -> return Mono.just("fallback"));
}
}
サーキットブレーカの動作は、Customizer Beanインタフェースを使用して設定できる。 Customizerはすべてのサーキットブレーカにデフォルト設定を提供し、個々のサーキットブレーカに特定の設定も提供できる。
以下は、Resilience4jの実装に後ろ盾されたすべてのサーキットブレーカにデフォルト設定を提供する方法を示すスニペットである。
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig
.custom()
.timeoutDuration(Duration.ofSeconds(4))
.build();
return factory ->
factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.build());
}
Spring Cloud Circuit Breakerのjarファイルは、現在Springスナップショットリポジトリで入手できる。プロジェクトのドキュメントには、中心的な概念とさまざまな設定オプションが記載されている。