1. 概要

この記事では、ZuulとEurekaで負荷分散がどのように機能するかを見ていきます。

ZuulProxyを介してSpring CloudEurekaによって検出されたRESTサービスにリクエストをルーティングします。

2. 初期設定

記事Spring CloudNetflix-Eureka に示されているように、Eurekaサーバー/クライアントをセットアップする必要があります。

3. Zuulの構成

Zuulは、とりわけ、Eurekaサービスの場所からフェッチし、サーバー側の負荷分散を行います。

3.1. Maven構成

まず、 Zuul ServerEureka依存関係pom.xml:に追加します。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

3.2. ユーレカとのコミュニケーション

次に、Zuulのapplication.propertiesファイルに必要なプロパティを追加します。

server.port=8762
spring.application.name=zuul-server
eureka.instance.preferIpAddress=true
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
eureka.client.serviceUrl.defaultZone=${EUREKA_URI:http://localhost:8761/eureka}

ここでは、ZuulにEurekaでサービスとして登録し、ポート8762で実行するように指示しています。

次に、 メインクラス @EnableZuulProxyおよび@EnableDiscoveryClient。 @EnableZuulProxy これをZuulServerとして示し、 @EnableDiscoveryClient これをEurekaクライアントとして示します。

@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulConfig {
    public static void main(String[] args) {
        SpringApplication.run(ZuulConfig.class, args);
    }
}

ブラウザでhttp:// localhost:8762 /routersを指定します。 これにより、 Eureka:によって検出されたZuulで利用可能なすべてのルートが表示されます。

{"/spring-cloud-eureka-client/**":"spring-cloud-eureka-client"}

次に、取得したZuulProxyルートを使用してEurekaクライアントと通信します。 ブラウザでhttp:// localhost:8762 / spring-cloud-eureka-client /greeting を指定すると、次のような応答が生成されます。

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

4. Zuulとの負荷分散

Zuulはリクエストを受信すると、利用可能な物理的な場所の1つを取得し、リクエストを実際のサービスインスタンスに転送します。サービスインスタンスの場所をキャッシュして実際の場所にリクエストを転送するプロセス全体は次のとおりです。追加の構成を必要とせずに、箱から出して提供されます。

ここでは、Zuulが同じサービスの3つの異なるインスタンスをどのようにカプセル化しているかを確認できます。

内部的には、ZuulはNetflixリボンを使用して、サービス検出(Eurekaサーバー)からサービスのすべてのインスタンスを検索します。

複数のインスタンスが発生した場合のこの動作を観察してみましょう。

4.1. 複数のインスタンスの登録

まず、2つのインスタンス(8081ポートと8082ポート)を実行します。

すべてのインスタンスが起動すると、インスタンスの物理的な場所が DynamicServerListLoadBalancer に登録され、ルートが Zuul Controller にマップされ、リクエストの転送を処理することがログで確認できます。実際のインスタンス:

Mapped URL path [/spring-cloud-eureka-client/**] onto handler of type [class org.springframework.cloud.netflix.zuul.web.ZuulController]
Client:spring-cloud-eureka-client instantiated a LoadBalancer:
  DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client,
  current list of Servers=[],Load balancer stats=Zone stats: {},Server stats: []}ServerList:null
Using serverListUpdater PollingServerListUpdater
DynamicServerListLoadBalancer for client spring-cloud-eureka-client initialized: 
  DynamicServerListLoadBalancer:{NFLoadBalancer:name=spring-cloud-eureka-client,
  current list of Servers=[0.0.0.0:8081, 0.0.0.0:8082],
  Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone;	Instance count:2;	
  Active connections count: 0;	Circuit breaker tripped count: 0;	
  Active connections per server: 0.0;]},
  Server stats: 
    [[Server:0.0.0.0:8080;	Zone:defaultZone;......],
    [Server:0.0.0.0:8081;	Zone:defaultZone; ......],

注:ログは読みやすくするためにフォーマットされています。

4.2. 負荷分散の例

ブラウザをhttp:// localhost:8762 / spring -cloud-eureka-client/greetingに数回移動してみましょう。

毎回、わずかに異なる結果が表示されるはずです。

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8082'!
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!

Zuulが受信した各リクエストは、ラウンドロビン方式で異なるインスタンスに転送されます。

別のインスタンスを開始してEurekaに登録すると、Zuulはそれを自動的に登録し、リクエストの転送を開始します。

Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8083'!

Zuulの負荷分散戦略を他のNetflixリボン戦略に変更することもできます。これについて詳しくは、リボンの記事を参照してください。

5. 結論

これまで見てきたように、ZuulはRest Serviceのすべてのインスタンスに単一のURLを提供し、負荷分散を行って、ラウンドロビン方式でインスタンスの1つにリクエストを転送します。

いつものように、この記事の完全なコードはGitHubのにあります。