ゲートウェイ ルーティング パターンGateway Routing pattern

単一のエンドポイントを使用して複数のサービスに要求をルーティングします。Route requests to multiple services using a single endpoint. このパターンは、単一のエンドポイントで複数のサービスを公開し、要求に基づいて適切なサービスにルーティングする場合に便利です。This pattern is useful when you wish to expose multiple services on a single endpoint and route to the appropriate service based on the request.

コンテキストと問題Context and problem

クライアントが複数のサービスを使用する必要がある場合、サービスごとに個別のエンドポイントを設定し、クライアントが各エンドポイントを管理するのは難しい場合があります。When a client needs to consume multiple services, setting up a separate endpoint for each service and having the client manage each endpoint can be challenging. たとえば、電子商取引アプリケーションが、検索、レビュー、カート、チェックアウト、注文履歴などのサービスを提供しているとします。For example, an e-commerce application might provide services such as search, reviews, cart, checkout, and order history. クライアントが対話する必要のある API がサービスごとに異なり、クライアントはサービスに接続するために、各エンドポイントを把握する必要があります。Each service has a different API that the client must interact with, and the client must know about each endpoint in order to connect to the services. API が変更された場合、クライアントも更新する必要があります。If an API changes, the client must be updated as well. サービスを複数の個別のサービスにリファクタリングする場合は、サービスとクライアントの両方でコードを変更する必要があります。If you refactor a service into two or more separate services, the code must change in both the service and the client.

解決策Solution

一連のアプリケーション、サービス、またはデプロイの前にゲートウェイを配置します。Place a gateway in front of a set of applications, services, or deployments. アプリケーションのレイヤー 7 ルーティングを使用して、要求を適切なインスタンスにルーティングします。Use application Layer 7 routing to route the request to the appropriate instances.

このパターンでは、クライアント アプリケーションは、単一のエンドポイントを把握し、そのエンドポイントと通信するだけで済みます。With this pattern, the client application only needs to know about and communicate with a single endpoint. サービスが統合または分解されても、クライアントを必ずしも更新する必要はありません。If a service is consolidated or decomposed, the client does not necessarily require updating. 引き続きゲートウェイに要求することができ、ルーティングだけが変更されます。It can continue making requests to the gateway, and only the routing changes.

また、ゲートウェイにより、クライアントからバックエンド サービスを抽象化できるので、ゲートウェイの背後でバックエンド サービスの変更を可能にしながら、クライアント呼び出しをシンプルに保つことができます。A gateway also lets you abstract backend services from the clients, allowing you to keep client calls simple while enabling changes in the backend services behind the gateway. クライアント呼び出しは、クライアントの予想される動作を処理する必要がある 1 つまたは複数のサービスにルーティングできるので、クライアントを変更せずに、ゲートウェイの背後でサービスを追加、分割、再構成できます。Client calls can be routed to whatever service or services need to handle the expected client behavior, allowing you to add, split, and reorganize services behind the gateway without changing the client.

ゲートウェイ ルーティング パターンの図

このパターンは、更新プログラムをユーザーにロールアウトする方法を管理できるため、デプロイでも役立ちます。This pattern can also help with deployment, by allowing you to manage how updates are rolled out to users. サービスの新しいバージョンをデプロイするときは、既存のバージョンと並行してデプロイできます。When a new version of your service is deployed, it can be deployed in parallel with the existing version. ルーティングにより、クライアントに提示するサービスのバージョンを制御できるため、更新プログラムのロールアウトが増分、並列、完全のいずれであるかを問わず、さまざまなリリース戦略を使用する柔軟がもたらされます。Routing lets you control what version of the service is presented to the clients, giving you the flexibility to use various release strategies, whether incremental, parallel, or complete rollouts of updates. 新しいサービスのデプロイ後に問題が見つかった場合、ゲートウェイで構成変更を行うことで、クライアントに影響を及ぼすことなく、簡単に元に戻すことができます。Any issues discovered after the new service is deployed can be quickly reverted by making a configuration change at the gateway, without affecting clients.

問題と注意事項Issues and considerations

  • ゲートウェイ サービスによって、単一障害点が生じる可能性があります。The gateway service may introduce a single point of failure. 可用性の要件が満たされるように、適切に設計されていることを確認します。Ensure it is properly designed to meet your availability requirements. 実装時の回復性とフォールト トレランス機能を検討してください。Consider resiliency and fault tolerance capabilities when implementing.
  • ゲートウェイ サービスによって、ボトルネックが生じる可能性があります。The gateway service may introduce a bottleneck. ゲートウェイが負荷を処理できる十分なパフォーマンスを備えており、成長予測に合わせて簡単に拡張できることを確認します。Ensure the gateway has adequate performance to handle load and can easily scale in line with your growth expectations.
  • サービスのカスケードのエラーが発生しないように、ゲートウェイに対してロード テストを実行します。Perform load testing against the gateway to ensure you don't introduce cascading failures for services.
  • ゲートウェイ ルーティングはレベル 7 です。Gateway routing is level 7. IP、ポート、ヘッダー、または URL に基づくことができます。It can be based on IP, port, header, or URL.

このパターンを使用する状況When to use this pattern

このパターンは次の状況で使用します。Use this pattern when:

  • クライアントが、ゲートウェイの背後でアクセスできる複数のサービスを使用する必要がある場合。A client needs to consume multiple services that can be accessed behind a gateway.
  • 単一のエンドポイントを使用することで、クライアント アプリケーションを簡素化する場合。You wish to simplify client applications by using a single endpoint.
  • 外部でアドレス指定可能なエンドポイントから内部仮想エンドポイントに要求をルーティングする必要がある場合 (VM のポートをクラスターの仮想 IP アドレスに公開する場合など)。You need to route requests from externally addressable endpoints to internal virtual endpoints, such as exposing ports on a VM to cluster virtual IP addresses.

このパターンは、1 つか 2 つのサービスしか使用しない単純なアプリケーションには適していないことがあります。This pattern may not be suitable when you have a simple application that uses only one or two services.

Example

ルーターとして Nginx を使用して、さまざまな仮想ディレクトリに存在するアプリケーションの要求を、それぞれバックエンドの異なるコンピューターにルーティングするサーバーの構成ファイルの簡単な例を次に示します。Using Nginx as the router, the following is a simple example configuration file for a server that routes requests for applications residing on different virtual directories to different machines at the back end.

server {
    listen 80;
    server_name domain.com;

    location /app1 {
        proxy_pass http://10.0.3.10:80;
    }

    location /app2 {
        proxy_pass http://10.0.3.20:80;
    }

    location /app3 {
        proxy_pass http://10.0.3.30:80;
    }
}

Azure では、Application Gateway のインスタンスの背後に複数のサービスを設定することができます。これにより、レイヤー 7 ルーティングが提供されます。On Azure, multiple services can be set up behind an Application Gateway instance, which provides layer-7 routing.