Netflixリボンを使用したSpring Cloud Rest Clientの紹介

1前書き

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

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

  • Service Discovery Integration - リボンロードバランサーが提供

クラウドのような動的環境でのサービス検出との統合 EurekaとNetflixのサービス検出コンポーネントがリボンに含まれています としょうかん Fault Tolerance ** - リボンAPIは動的に判断できるかどうか

サーバーは稼働中の環境で稼働しており、検出することができます。 停止しているサーバー 設定可能なロードバランシングルール** - リボンサポート

RoundRobinRule AvailabilityFilteringRule WeightedResponseTimeRule はそのまま使用でき、カスタムルールの定義もサポート

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

スピンしてみましょう。

2依存関係管理

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

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

最新のライブラリはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cspring-cloud-starter-ribbon[ここ]にあります。

3アプリケーション例

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

Ribbonの負荷分散戦略の1つである WeightedResponseTimeRule を使用して、2つのサーバー間でクライアント側の負荷分散を有効にします。これは、構成ファイルの名前付きクライアントで定義されています。

4リボン構成

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

  • Rule - 負荷分散ルールを指定するロジックコンポーネント

我々のアプリケーションで使用しています ** Ping - 決定に使用するメカニズムを指定するComponent

サーバーのリアルタイムの可用性 ** 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を設定することにより、Eurekaサービス検出コンポーネントを無効にしました。

有効 から false ** これでロードバランシングに利用できるサーバのリストを定義

ケース、2台のサーバー ** ServerListRefreshInterval でサーバーのリフレッシュレートを設定しました

6. RibbonClient

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

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

    @LoadBalanced
    @Bean
    RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    @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);
    }
}

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

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

RestTemplate @ LoadBalanced という注釈が付けられていることに注意してください。

7. リボンの破損耐性

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

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

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

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

すべてのサーバーが停止しているため、要求を処理するのに使用できるサーバーがない場合、 pingUrl() は失敗し、例外「 java.lang.IllegalStateException 」を受け取り、「要求を処理するためのインスタンスはありません」というメッセージが表示されます。

8結論

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

上記の例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-ribbon-client[GitHub repository]にあります。