マイクロサービスでのサービスディスカバリ
1. 序章
マイクロサービスを扱う場合、サービスが正確な場所を知らなくても別のサービスを使用できるようにするメカニズムが必要になります。 このチュートリアルでは、サービスディスカバリの概念について説明します。
2. サービスディスカバリとは何ですか?
多かれ少なかれ複雑なアプリケーションを構成するいくつかのマイクロサービスを想像してみましょう。 これらは何らかの形で相互に通信します(例: API Rest 、 gRPC )。
3. サービスディスカバリの必要性
マイクロサービスは、通信するすべてのサービスの場所(IPアドレスとポート)を知る必要があります。サービス検出メカニズムを採用しないと、サービスの場所が結合され、システムの保守が困難になります。 。 従来のアプリケーションでは、場所を配線したり、構成を介してそれらを挿入したりできますが、この種の最新のクラウドベースのアプリケーションではお勧めしません。
4. サービスディスカバリはどのように機能しますか?
Service Discoveryは、2つの部分で処理を行います。 まず、インスタンスが登録して「私はここにいます!」と言うメカニズムを提供します。次に、登録後にサービスを見つける方法を提供します。
これまでに説明した概念を例を挙げて明確にしましょう。サービスコンシューマーとサービスプロバイダー( REST API を公開するサービス)です。 サービスコンシューマーは、データの読み取りと書き込みを行うためにサービスプロバイダーを必要とします。
次の図は、通信フローを示しています。
図に示されている手順を説明しましょう。
- サービスプロバイダーの場所は、サービスレジストリ(利用可能なすべてのサービスインスタンスの場所を含むデータベース)に送信されます。
- サービスコンシューマーは、サービスディスカバリサーバーにサービスプロバイダーの場所を尋ねます。
- サービスプロバイダーの場所は、内部データベースのサービスレジストリによって検索され、サービスコンシューマーに返されます。
- サービスコンシューマーは、サービスプロバイダーに直接リクエストできるようになりました。
主なサービス検出パターンには、クライアント側検出とサーバー側検出の2つがあります。 それらを明確にしましょう。
5. サービスディスカバリの実装
5.1. クライアント側のサービスディスカバリ
クライアント側の検出を使用する場合、サービスコンシューマーは、使用可能なサービスインスタンスのネットワークロケーションを決定し、それらの間で要求を負荷分散する責任があります。クライアントはサービスレジスタにクエリを実行します。 次に、クライアントは負荷分散アルゴリズムを使用して、使用可能なサービスインスタンスの1つを選択し、要求を実行します。
次の図は、今説明したパターンを示しています。
クライアント側の負荷分散に責任を与えることは、負担であると同時に利点でもあります。
また、サービスコンシューマとサービスレジストリは完全に結合していることも指摘できます。 つまり、クライアント側の検出ロジックは、サービスコンシューマーが使用するプログラミング言語とフレームワークごとに実装する必要があります。
クライアント側の検出を明確にしたので、サーバー側の検出を見てみましょう。
5.2. サーバー側のサービス検出
Service Discoveryの代替アプローチは、サーバー側検出モデルです。これは、ロードバランサーとして機能する仲介者を使用します。クライアントは、オーケストレーターとして機能するロードバランサーを介してサービスに要求を行います。 ロードバランサーはサービスレジストリにクエリを実行し、各リクエストを利用可能なサービスインスタンスにルーティングします。
次の図は、通信がどのように行われるかを示しています。
このアプローチでは、専用のアクターであるロードバランサーがロードバランシングの役割を果たします。 これがこのアプローチの主な利点です。 実際、このレベルの抽象化を作成すると、ルックアップ手順を処理する必要がないため、サービスコンシューマーが軽くなります。実際のところ、言語ごとに個別に検出ロジックを実装する必要はありません。およびサービスコンシューマーが使用するフレームワーク。
一方、ロードバランサーが既に展開環境で提供されていない限り、ロードバランサーをセットアップして管理する必要があります。
検出メカニズムへのさまざまなアプローチについて詳しく説明したので、次に登録メカニズムに移りましょう。
6. サービスレジストリとは何ですか?
これまでのところ、サービスレジストリは各マイクロサービスの場所をすでに知っていると想定してきました。 しかし、この登録および登録解除操作はどのように行われますか?
サービスレジスタは、サービス識別の重要な部分です。 これは、サービスインスタンスのネットワークロケーションを含むデータベースです。サービスレジストリは、高可用性で最新のものである必要があります。 クライアントは、サービスレジストリから取得したネットワークパスをキャッシュできます。 ただし、この情報は最終的には廃止され、クライアントはサービスインスタンスに到達しなくなります。 したがって、サービスレジストリは、レプリケーションプロトコルを使用して整合性を維持するサーバーのクラスタで構成されます。
それをより詳細に見て、2つの可能なアプローチを説明しましょう。
7. サービス登録オプション
7.1. 自己登録
自己登録モデルを使用する場合、サービスインスタンスはサービスレジストリへの登録と登録解除を担当します。さらに、必要に応じて、サービスインスタンスはハートビートリクエストをその登録を存続させてください。 次の図は、このパターンの構造を示しています。
自己登録モデルには、いくつかの長所と短所があります。 1つの利点は、比較的単純であり、仲介者として他のシステムコンポーネントを必要としないことです。 ただし、重大な欠点は、サービスインスタンスをサービスレジストリに結合することです。つまり、使用する各言語とフレームワークで登録コードを実装する必要があります。
サービスをサービスレジストリから切り離す別のアプローチは、サードパーティの登録スキームです。
7.2. サードパーティの登録
サードパーティの登録モデルを使用する場合、サービスインスタンスはサービスレジストリへの登録を担当しません。 代わりに、サービスレジスタと呼ばれる別のシステムコンポーネントが登録を担当します。 サービスレジスタは、展開環境をポーリングするか、イベントをサブスクライブすることにより、実行中のインスタンスへの変更を追跡します。新しく利用可能なサービスインスタンスを検出すると、データベースに記録します。 サービスレジストリは、終了したサービスインスタンスの登録も解除します。 次の図はこれを示しています。
自己登録と同様に、サードパーティの登録スキームにもさまざまな長所と短所があります。 主な利点の1つは、サービスがサービスレジストリから分離されていることです。 プログラミング言語やフレームワークごとにサービス登録ロジックを実装する必要はありません。 代わりに、サービスインスタンスの登録は、専用サービス内で一元的に管理されます。
このモデルの欠点の1つは、展開環境に組み込まれていない限り、セットアップと管理が必要なもう1つの高可用性システムコンポーネントであるということです。
8. 結論
この記事では、マイクロサービスアプリケーションに、動的な変更で実行される複数のサービスインスタンスがどのように含まれるかについて概説します。 これらのインスタンスには動的なネットワークロケーションがあり、通信またはロケーションを特定する方法が必要です。 したがって、クライアントが要求を行うには、サービスディスカバリなどのメカニズムが必要です。
Service Discoveryは、使用可能なサービスインスタンスのデータベースを提供することで役立ち、使用状況に基づいてサービスを検出、登録、および登録解除できます。