エウレカ登録センター
図に示すように、サービス プロバイダーのユーザー サービスが複数のインスタンスをデプロイする場合:
いくつかの質問について考えてみましょう。
- order-service がリモート呼び出しを開始するとき、ユーザー サービス インスタンスの IP アドレスとポートをどのようにして知るのでしょうか?
- ユーザーサービスインスタンスのアドレスが複数ありますが、order-service を呼び出すときにどのように選択すればよいですか?
- order-service は、ユーザー サービス インスタンスがまだ正常であるかダウンしているかをどのようにして知るのでしょうか?
1.1.エウレカの構造と機能
これらの問題は、Spring Cloud の登録センターを使用して解決する必要があります。最もよく知られている登録センターは Eureka で、その構造は次のとおりです。
前述の各質問に答えてください。
質問 1: order-service はどのようにして user-service インスタンスのアドレスを知るのでしょうか?
住所情報を取得する手順は次のとおりです。
- user-serviceサービスインスタンス起動後、eureka-server(エウレカサーバー)に情報を登録します。これをサービス登録といいます
- eureka-server は、サービス名とサービス インスタンスのアドレス リスト間のマッピング関係を保存します。
- order-service は、サービス名に基づいてインスタンスのアドレスリストを取得します。これはサービス ディスカバリまたはサービス プルと呼ばれます
質問 2: order-service は、複数の user-service インスタンスから特定のインスタンスをどのように選択しますか?
- order-service は、負荷分散アルゴリズムを使用してインスタンス リストからインスタンス アドレスを選択します。
- インスタンスアドレスへのリモート呼び出しを開始します。
質問 3: order-service は、特定のユーザー サービス インスタンスがまだ正常であるかダウンしているかをどのようにして知るのでしょうか?
- ユーザー サービスは、一定の間隔 (デフォルトは 30 秒) で eureka サーバーへのリクエストを開始し、ハートビートと呼ばれる独自のステータスを報告します。
- 一定期間ハートビートが送信されない場合、eureka-server はマイクロサービス インスタンスに障害があるとみなし、そのインスタンスをサービス リストから削除します。
- order-service がサービスをプルすると、障害のあるインスタンスを削除できます。
注: マイクロサービスはサービス プロバイダーとサービス コンシューマーの両方になることができるため、eureka はサービス登録、サービス検出、その他の機能を eureka-client に均一にカプセル化します。
したがって、次の実践的なステップは次のとおりです。
1.2.eureka-serverの構築
まず、全員が中央サーバー eureka-server を登録します。これは独立したマイクロサービスである必要があります。
1.2.1. eureka-server サービスの作成
Cloud-demo 親プロジェクトの下に、サブモジュールを作成します。
モジュール情報を入力します。
次に、サービス情報を入力します。
1.2.2.eureka 依存関係の導入
SpringCloud によって eureka に提供されるスターター依存関係を導入します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
1.2.3.スタートアップクラスの書き込み
eureka-server サービスのスタートアップ クラスを作成します。eureka の登録センター機能を有効にするために @EnableEurekaServer アノテーションを必ず追加してください。
package cn.itcast.eureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
1.2.4.設定ファイルの書き込み
次の内容を含む application.yml ファイルを作成します。
server:
port: 10086
spring:
application:
name: eureka-server
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
1.2.5.サービスの開始
マイクロサービスを開始し、ブラウザーでアクセスします: http://127.0.0.1:10086
次の結果が表示されれば、成功したことがわかります。
1.3.サービス登録
次に、eureka-serverにuser-serviceを登録します。
1) 依存関係を導入する
user-service の pom ファイルに、次の eureka-client 依存関係を導入します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2) 設定ファイル
user-service で、application.yml ファイルを変更し、サービス名と eureka アドレスを追加します。
spring:
application:
name: userservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
3) 複数のユーザーサービスインスタンスを開始する
サービスに複数のインスタンスがあるシナリオを示すために、SpringBoot スタートアップ構成を追加し、ユーザー サービスを開始します。
まず、元のユーザー サービスの起動設定をコピーします。
次に、ポップアップ ウィンドウで次の情報を入力します。
これで、2 つのユーザー サービスのスタートアップ構成が SpringBoot ウィンドウに表示されます。
ただし、最初のポートはポート 8081、2 番目のポートはポート 8082 です。
2 つのユーザー サービス インスタンスを開始します。
eureka-server 管理ページを表示します。
1.4.サービスの検出
次に、order-service のロジックを変更します。eureka-server からユーザー サービス情報をプルして、サービス ディスカバリを実現します。
1) 依存関係を導入する
前述したように、サービス検出とサービス登録はすべて eureka-client 依存関係にカプセル化されているため、この手順はサービス登録と一致します。
order-service の pom ファイルに、次の eureka-client 依存関係を導入します。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2) 設定ファイル
サービス検出では、エウレカ アドレスも知る必要があるため、2 番目のステップはサービス登録と一致しており、エウレカ情報を構成します。
order-service で、application.yml ファイルを変更し、サービス名と eureka アドレスを追加します。
spring:
application:
name: orderservice
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka
3) サービスのプルと負荷分散
最後に、eureka-server から user-service サービスのインスタンス リストを取得し、負荷分散を実装します。
ただし、これらのアクションを実行する必要はなく、いくつかの注釈を追加するだけで済みます。
order-service の OrderApplication で、RestTemplate Bean に @LoadBalanced アノテーションを追加します。
order-service サービスの cn.itcast.order.service パッケージの下にある OrderService クラスの queryOrderById メソッドを変更します。アクセスした URL パスを変更し、IP とポートをサービス名に置き換えます。
Spring は、userservice サービス名に基づいて eureka-server 側からインスタンス リストを取得し、負荷分散を完了するのに自動的に役立ちます。
Dark Horse Programmer Tutorial から編集された学習メモ