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]にあります。