1. 概要

このチュートリアルでは、 Spring Cloudサーキットブレーカープロジェクトを紹介し、それをどのように利用できるかを学びます。

まず、既存のサーキットブレーカーの実装に加えて、Spring Cloudサーキットブレーカーが提供するものを確認します。 次に、 Spring Boot自動構成メカニズムを使用して、1つ以上の回路ブレーカーをアプリケーションに統合する方法を学習します。

Introduction to Hystrix Spring Cloud Netflix Hystrix 、および Guide to Resilience4j で、サーキットブレーカーとは何か、およびそれらがどのように機能するかについての詳細情報があることに注意してください。 ]。

2. 春のクラウドサーキットブレーカー

最近まで、Spring Cloudは、アプリケーションにサーキットブレーカーを追加する1つの方法しか提供していませんでした。 これは、SpringCloudNetflixプロジェクトの一部としてNetflixHystrixを使用したことによるものです。

Spring Cloud Netflixプロジェクトは、実際にはHystrixのアノテーションベースのラッパーライブラリです。 したがって、これら2つのライブラリは緊密に結合されています。 これは、アプリケーションを変更せずに別のサーキットブレーカーの実装に切り替えることができないことを意味します。

Spring CloudCircuitBreakerプロジェクトはこれを解決します。 さまざまなサーキットブレーカーの実装にまたがる抽象化レイヤーを提供します。プラグイン可能なアーキテクチャです。 したがって、提供された抽象化/インターフェースに対してコーディングし、ニーズに基づいて別の実装に切り替えることができます。

この例では、 Resilience4Jの実装のみに焦点を当てます。ただし、これらの手法は他のプラグインにも使用できます。

3. 自動構成

アプリケーションで特定のサーキットブレーカーの実装を使用するには、適切なSpringスターターを追加する必要があります。この場合、spring-cloud-starter-circuitbreaker-resilience4jを使用します。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
    <version>1.0.2.RELEASE</version>
</dependency>

自動構成メカニズムは、クラスパスにスターターの1つが含まれている場合、必要なサーキットブレーカーBeanを構成します。

Resilience4Jの自動構成を無効にする場合は、spring.cloud.circuitbreaker.resilience4j.enabledプロパティをfalseに設定できます。

4. 簡単なサーキットブレーカの例

Spring Bootを使用してWebアプリケーションを作成し、Spring Cloudサーキットブレーカーライブラリがどのように機能するかを調べてみましょう。

アルバムのリストを返す簡単なWebサービスを構築します。 生のリストがサードパーティのサービスによって提供されていると仮定しましょう。 簡単にするために、Jsonplaceholderによって提供される外部ダミーAPIを使用してリストを取得します。

https://jsonplaceholder.typicode.com/albums

4.1. サーキットブレーカを作成する

最初のサーキットブレーカを作成しましょう。 CircuitBreakerFactorybeanのインスタンスを挿入することから始めます。

@Service
public class AlbumService {
    
    @Autowired
    private CircuitBreakerFactory circuitBreakerFactory;

    //... 

}

これで、 CircuitBreakerFactory#createメソッドを使用してサーキットブレーカーを簡単に作成できます。 回路ブレーカー識別子を引数として取ります。

CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");

4.2. サーキットブレーカーでタスクをラップする

サーキットブレーカーで保護されたタスクをラップして実行するには、Supplierを引数として取るrunメソッドを呼び出す必要があります。

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "https://jsonplaceholder.typicode.com/albums";

    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class));
}

サーキットブレーカは私たちのために私たちの方法を実行し、フォールトトレランスを提供します。

外部サービスが応答するのに時間がかかりすぎたり、予期しない例外がスローされたり、外部サービスまたはホストが存在しない場合があります。 その場合、 runメソッドの2番目の引数としてフォールバックを提供できます。

public String getAlbumList() {
    CircuitBreaker circuitBreaker = circuitBreakerFactory.create("circuitbreaker");
    String url = "http://localhost:1234/not-real";
    
    return circuitBreaker.run(() -> restTemplate.getForObject(url, String.class), 
      throwable -> getDefaultAlbumList());
}

フォールバックのラムダは、エラーを説明するThrowableを入力として受け取ります。 これは、フォールバックをトリガーした例外のタイプに基づいて、呼び出し元に異なるフォールバック結果を提供できることを意味します。

この場合、例外は考慮されません。 キャッシュされたアルバムのリストを返すだけです。

外部呼び出しが例外で終了し、フォールバックが提供されない場合、SpringによってNoFallbackAvailableExceptionがスローされます。

4.3. コントローラを構築する

それでは、例を終了して、サービスメソッドを呼び出し、ブラウザーを介して結果を表示する単純なコントローラーを作成しましょう。

@RestController
public class Controller {

    @Autowired
    private Service service;

    @GetMapping("/albums")
    public String albums() {
        return service.getAlbumList();
    }

}

最後に、RESTサービスを呼び出して、結果を確認しましょう。

[GET] http://localhost:8080/albums

5. グローバルカスタム構成

通常、デフォルトの構成では不十分です。 このため、ユースケースに基づいてカスタム構成のサーキットブレーカを作成する必要があります。

デフォルトの構成をオーバーライドするには、@Configurationクラスで独自のBeanとプロパティを指定する必要があります。

ここでは、すべての回路ブレーカーのグローバル構成を定義します。 このために、 カスタマイザーを定義する必要があります 。 それでは、Resilience4JCircuitBreakerFactory実装を使用しましょう。

まず、Resilience4jチュートリアルに従ってサーキットブレーカーとタイムリミッターの構成クラスを定義します。

CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
  .failureRateThreshold(50)
  .waitDurationInOpenState(Duration.ofMillis(1000))
  .slidingWindowSize(2)
  .build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
  .timeoutDuration(Duration.ofSeconds(4))
  .build();

次に、 Resilience4JCircuitBreakerFactory.configureDefault メソッドを使用して、 Customizerbeanに構成を埋め込みます。

@Configuration
public class Resilience4JConfiguration {
    @Bean
    public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
        
        // the circuitBreakerConfig and timeLimiterConfig objects

        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
          .timeLimiterConfig(timeLimiterConfig)
          .circuitBreakerConfig(circuitBreakerConfig)
          .build());
    } 
}

6. 特定のカスタム構成

もちろん、アプリケーションには複数のサーキットブレーカーを含めることができます。したがって、場合によっては、サーキットブレーカーごとに特定の構成が必要になります。

同様に、1つ以上のCustomizerBeanを定義できます。 次に、 Resilience4JCircuitBreakerFactory.configure メソッドを使用して、それぞれに異なる構成を提供できます。

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration1() {

    // the circuitBreakerConfig and timeLimiterConfig objects

    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
      .timeLimiterConfig(timeLimiterConfig).build(), "circuitBreaker");
}

ここでは、2番目のパラメーターである構成している回路ブレーカーのIDを提供します。

同じ方法で回路ブレーカーIDのリストを提供することにより、同じ構成で複数の回路ブレーカーを設定することもできます。

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> specificCustomConfiguration2() {

    // the circuitBreakerConfig and timeLimiterConfig objects

    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(circuitBreakerConfig)
      .timeLimiterConfig(timeLimiterConfig).build(),
        "circuitBreaker1", "circuitBreaker2", "circuitBreaker3");
}

7. 代替実装

Resilience4j 実装を使用して、Spring Cloudサーキットブレーカーで1つ以上のサーキットブレーカーを作成する方法を見てきました。

ただし、Spring Cloud Circuit Breakerでサポートされている他の実装があり、アプリケーションで活用できます。

アプリケーションでさまざまなサーキットブレーカーの実装を組み合わせて使用できることは言及する価値があります。 ライブラリは1つだけではありません。

上記のライブラリには、ここで説明したよりも多くの機能があります。 ただし、Spring Cloud Circuit Breakerは、サーキットブレーカー部分のみを抽象化したものです。 たとえば、Resilience4jは、 CircuitBreaker TimeLimiter に加えて、 RateLimiter Bulkhead Retryなどの他のモジュールも提供します。 ]この記事で使用されているモジュール。

8. 結論

この記事では、Spring CloudCircuitBreakerプロジェクトを発見しました。

最初に、Spring Cloud Circuit Breakerとは何か、そしてそれによってアプリケーションにサーキットブレーカーを追加する方法を学びました。

次に、回路ブレーカーを定義して統合する方法を示すために、SpringBoot自動構成メカニズムを活用しました。 また、Spring CloudCircuitBreakerが単純なRESTサービスを介してどのように機能するかを示しました。

最後に、すべての回路ブレーカーを一緒に、または個別に構成する方法を学びました。

いつものように、このチュートリアルのソースコードは、GitHubからで入手できます。