ZuulとEurekaによる負荷分散の例
1.概要
この記事では、ZuulとEurekaでロードバランシングがどのように機能するかを見ていきます。
-
Spring Cloud Eurekaが発見したRESTサービスにZuul Proxyを介してリクエストをルーティングします。
2.初期設定
記事リンク:/spring-cloud-netflix-eureka[Spring Cloud Netflix-Eureka]に示すように、
Eureka server/client
をセットアップする必要があります。
3. Zuulを設定する
Zuulは、Eurekaのサービス拠点から取得し、サーバー側の負荷分散を行います。
3.1. Mavenの設定
まず、
pom.xmlに
Zuul Server
と
Eurekaの依存関係__を追加します。
<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を使用して
mainクラスを実装します。 @EnableZuulProxy
はこれをZuul Serverとして示し、
@ EnableDiscoveryClient__はこれをEureka Clientとして示します。
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
public class ZuulConfig {
public static void main(String[]args) {
SpringApplication.run(ZuulConfig.class, args);
}
}
ブラウザでhttp://localhost:8762/routes[
http://localhost:8762/routes
]にアクセスします。 __Eurekaによって発見されたZuulで利用可能なすべてのルートが表示されます。
{"/spring-cloud-eureka-client/** ** ":"spring-cloud-eureka-client"}
これで、取得したZuul Proxyルートを使用してEurekaクライアントと通信します。ブラウザをhttp://localhost:8762/spring-cloud-eureka-client/greeting[
http://localhost:8762/spring-cloud-eureka-client/greeting
]に設定すると、次のような応答が生成されます。
Hello from 'SPRING-CLOUD-EUREKA-CLIENT with Port Number 8081'!
4. Zuulによる負荷分散
-
Zuulはリクエストを受信すると、利用可能な物理的な場所の1つを選び、実際のサービスインスタンスにリクエストを転送します。追加の設定は不要です。
ここでは、Zuulがどのようにして同じサービスの3つの異なるインスタンスをカプセル化しているのかを見ることができます。
リンク:/uploads/Zuul-1-300×126.jpg%20300w[]
内部的には、ZuulはNetflixリボンを使用して、サービス検出(Eureka Server)からサービスのすべてのインスタンスを検索します。
複数のインスタンスが起動されたときのこの動作を観察しましょう。
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/挨拶に何度かアクセスしてみましょう。
毎回、少し異なる結果が表示されるはずです。
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リボン戦略に変更することもできます。これについての詳細はRibbonリンク:/spring-cloud-rest-client-with-netflix-ribbon[記事]にあります。
5. 結論
ご覧のとおり、ZuulはRest Serviceのすべてのインスタンスに単一のURLを提供し、ラウンドロビン方式でリクエストをインスタンスの1つに転送するために負荷分散を行います。
いつものように、この記事の完全なコードはhttps://github.com/eugenp/tutorials/tree/master/spring-cloud/spring-cloud-zuul-eureka-integration[over on GitHub]にあります。