1. 序章

Netflix Ribbon は、プロセス間通信(IPC)クラウドライブラリです。 リボンは、主にクライアント側の負荷分散アルゴリズムを提供します。

クライアント側の負荷分散アルゴリズムとは別に、Ribbonは他の機能も提供します。

  • サービス検出の統合–リボンロードバランサーは、クラウドなどの動的な環境でサービス検出を提供します。 EurekaおよびNetflixサービスディスカバリコンポーネントとの統合は、リボンライブラリに含まれています
  • フォールトトレランス–リボンAPIは、サーバーが稼働中の環境で稼働しているかどうかを動的に判断し、稼働中のサーバーを検出できます。
  • 構成可能な負荷分散ルール–リボンは RoundRobinRule AvailabilityFilteringRule WeightedResponseTimeRule をサポートし、カスタムルールの定義もサポートします

リボンAPIは、「名前付きクライアント」と呼ばれる概念に基づいて機能します。 アプリケーション構成ファイルでリボンを構成するときに、負荷分散に含まれるサーバーのリストの名前を指定します。

試してみましょう。

2. 依存関係の管理

NetflixリボンAPIは、 pom.xml:に以下の依存関係を追加することでプロジェクトに追加できます。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>

最新のライブラリはここにあります。

3. アプリケーション例

リボンAPIの動作を確認するために、Spring RestTemplate を使用してサンプルマイクロサービスアプリケーションを構築し、Spring CloudNetflixAPIとともにNetflixリボンAPIを使用して拡張します。

リボンの負荷分散戦略の1つであるWeightedResponseTimeRuleを使用して、アプリケーションで、構成ファイルの指定されたクライアントの下で定義されている2台のサーバー間のクライアント側の負荷分散を有効にします。

4. リボン構成

リボンAPIを使用すると、ロードバランサーの次のコンポーネントを構成できます。

  • Rule –アプリケーションで使用している負荷分散ルールを指定するロジックコンポーネント
  • Ping –サーバーの可用性をリアルタイムで判断するために使用するメカニズムを指定するコンポーネント
  • ServerList –動的または静的にすることができます。 この例では、サーバーの静的リストを使用しているため、アプリケーション構成ファイルで直接サーバーを定義しています。

ライブラリの簡単な構成を書いてみましょう。

public class RibbonConfiguration {

    @Autowired
    IClientConfig ribbonClientConfig;

    @Bean
    public IPing ribbonPing(IClientConfig config) {
        return new PingUrl();
    }

    @Bean
    public IRule ribbonRule(IClientConfig config) {
        return new WeightedResponseTimeRule();
    }
}

WeightedResponseTimeRule ルールを使用してサーバーを判別し、PingUrlメカニズムを使用してサーバーの可用性をリアルタイムで判別したことに注目してください。

このルールによれば、各サーバーには平均応答時間に応じた重みが与えられ、応答時間が短いほど重みは小さくなります。 このルールは、サーバーの重みによって可能性が決定されるサーバーをランダムに選択します。

また、 PingUrl はすべてのURLにpingを実行して、サーバーの可用性を判断します。

5. application.yml

以下は、このサンプルアプリケーション用に作成したapplication.yml構成ファイルです。

spring:
  application:
    name: spring-cloud-ribbon

server:
  port: 8888

ping-server:
  ribbon:
    eureka:
      enabled: false
    listOfServers: localhost:9092,localhost:9999
    ServerListRefreshInterval: 15000

上記のファイルでは、次のように指定しました。

  • アプリケーション名
  • アプリケーションのポート番号
  • サーバーのリストの名前付きクライアント:「ping-server」
  • eureka:enabledfalseに設定して、Eurekaサービスディスカバリコンポーネントを無効にしました
  • 負荷分散に使用できるサーバーのリストを定義しました。この場合は2台のサーバーです。
  • ServerListRefreshIntervalを使用してサーバーのリフレッシュレートを構成しました

6. RibbonClient

次に、メインのアプリケーションコンポーネントスニペットを設定しましょう。ここでは、プレーンな RestTemplate の代わりに、RibbonClientを使用して負荷分散を有効にします。

@SpringBootApplication
@RestController
@RibbonClient(
  name = "ping-a-server",
  configuration = RibbonConfiguration.class)
public class ServerLocationApp {

    @Autowired
    RestTemplate restTemplate;

    @RequestMapping("/server-location")
    public String serverLocation() {
        return this.restTemplate.getForObject(
          "http://ping-server/locaus", String.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(ServerLocationApp.class, args);
    }
}

そして、これがRestTemplate構成です。

@Configuration
public class RestTemplateConfiguration{
    @LoadBalanced
    @Bean
    RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

アノテーション@RestControllerを使用してコントローラークラスを定義しました。 また、クラスに@RibbonClientという名前と構成クラスの注釈を付けました。

ここで定義した構成クラスは、このアプリケーションに必要なリボンAPI構成を提供した前に定義したクラスと同じです。

RestTemplate@LoadBalancedの注釈を付けたことに注意してください。これは、これを負荷分散し、この場合はリボンを使用することを示しています。

7. リボンの破損回復力

この記事の前半で説明したように、Ribbon APIは、クライアント側の負荷分散アルゴリズムを提供するだけでなく、障害回復力も組み込んでいます。

前述のように、Ribbon APIは、定期的にサーバーにpingを実行することでサーバーの可用性を判断でき、稼働していないサーバーをスキップする機能を備えています。

それに加えて、指定された基準に基づいてサーバーをフィルターで除外するサーキットブレーカーパターンも実装しています。

サーキットブレーカーパターンは、タイムアウトを待たずに障害が発生しているサーバーへの要求を迅速に拒否することにより、サーバー障害がパフォーマンスに与える影響を最小限に抑えます。 プロパティniws.loadbalancer.availabilityFilteringRule.filterCircuitTrippedfalseに設定することで、このサーキットブレーカー機能を無効にできます。

すべてのサーバーがダウンしているため、リクエストを処理できるサーバーがない場合、 pingUrl()は失敗し、例外java.lang.IllegalStateExceptionとメッセージを受け取ります。 「リクエストを処理するために使用できるインスタンスはありません」

8. 結論

この記事では、NetflixリボンAPIとその簡単なサンプルアプリケーションでの実装について説明しました。

上記の例の完全なソースコードは、GitHubリポジトリにあります。