元のアドレス:https://microservices.io/patterns/service-registry.html
バックグラウンド
サービスにアクセスするクライアントは、クライアント側のサービス検出またはサーバー側のサービス検出を使用してサービスインスタンスの場所を特定し、このインスタンスに要求を送信して必要なサービスを呼び出します。
問題
クライアントサービスディスカバリでは、クライアントはサービスの利用可能なインスタンスがどこにあるかをどのように知るのですか?サーバー側の検出インスタンスでは、ロードバランサーはサービスの利用可能なインスタンスがどこにあるかをどのように認識しますか?
考慮事項
- 各インスタンスは、特定のホストとポートでリモートAPI(HTTP / REST、Thriftなど)を公開する場合があります
- サービスインスタンスの数とその場所は動的に変化します。仮想マシンとコンテナには通常、動的IPアドレスが割り当てられます。たとえば、AWS EC2自動スケーリンググループは、LOADに従ってインスタンスの数を調整します。
解決
サービスレジストリ、つまり、すべてのサービスとその場所のインスタンス情報を保存するデータベースを実現します。サービスインスタンスは、起動時にサービスレジストリに登録され、シャットダウン時に登録解除されます。サービスのクライアントやロードバランサーは、サービスレジストリにクエリを実行して、サービスの利用可能なインスタンスを見つけます。サービスレジストリは、サービスインスタンスのヘルスチェックAPIを呼び出して、リクエストを処理できるかどうかを確認します。
例えば
クライアントサービスによって検出されたアプリケーションの例を見てみましょう。Netflix Eurekaサービスレジストリを使用して、マイクロサービスフレームワークとしてSpringBootとSpringCloudを使用してScalaで記述されています。
Eurekaサーバーは小さなSpringBootアプリケーションです。
@SpringBootApplication
@EnableEurekaServer
public class EurekaServer {
public static void main(String[] args) {
new SpringApplicationBuilder(EurekaServer.class).web(true).run(args);
}
}
Dockerを使用してデプロイします。
eureka:
image: java:openjdk-8u91-jdk
working_dir: /app
volumes:
- ./eureka-server/build/libs:/app
command: java -jar /app/eureka-server.jar --server.port=8761
ports:
- "8761:8761"
他のサービスレジストリ(またはサービスレジストリとして一般的に使用されるテクノロジ)の例は次のとおりです。
Kubernetes、Marathon、AWS ELBなどの一部のシステムには、暗黙的なサービスレジストリロジックがあります。
結果分析
レジストリ設計モデルの利点は次のとおりです。
- サービスクライアントまたはロードバランサーは、サービスインスタンスの場所を動的に検出できます。
同時に、いくつかの欠点があります。
- サービスレジストリがインフラストラクチャに組み込まれていない限り、インフラストラクチャコンポーネントの別のセットを維持する必要があります。さらに、サービスレジストリは重要なシステムコンポーネントです。クライアントはサービスレジストリによって提供されたデータをキャッシュする必要がありますが、サービスレジストリがダウンすると、データは最終的に古くなります。したがって、レジストリは高可用性である必要があります。
サービスインスタンスをレジストリに登録する方法を選択する必要があります。2つのオプションがあります:
- 自己登録モード:サービスインスタンスは自己登録します。
- サードパーティ登録モード:サードパーティは、サービスインスタンスをサービス登録センターに登録します。
サービスレジストリのクライアントは、レジストリインスタンスの場所を知っている必要があります。レジストリインスタンスは固定のパブリックネットワークアドレスに展開する必要があり、これらのIPアドレスはクライアントで構成する必要があります。
たとえば、Netflix Eurekaサービスインスタンスは通常、エラスティックIPアドレスを使用してデプロイされます。使用可能なエラスティックIPアドレスプールは、プロパティファイルまたはDNSを使用して構成されます。Eurekaインスタンスが起動すると、構成を参照して使用可能なエラスティックIPアドレスが決定され、EurekaクライアントもエラスティックIPアドレスプールを構成します。
関連パターン
- クライアント検出サービス、サーバー検出サービス
- 2つのサービス登録方法:自己登録とサードパーティ登録
- ヘルスチェックAPI:サービスレジストリは、サービスインスタンスのヘルスチェックAPIを呼び出して、リクエストを処理できるかどうかを確認します