次の方法で共有


.NET でのサービス検出

この記事では、 Microsoft.Extensions.ServiceDiscovery ライブラリの使用方法について説明します。 サービス検出は、開発者が外部サービスを参照するために物理アドレス (IP アドレスとポート) の代わりに論理名を使用する方法です。

始めましょう

.NET でサービス検出を開始するには、 Microsoft.Extensions.ServiceDiscovery NuGet パッケージをインストールします。

dotnet add package Microsoft.Extensions.ServiceDiscovery --prerelease

または、.NET 10+ SDK を使用している場合:

dotnet package add Microsoft.Extensions.ServiceDiscovery --prerelease

詳細については、「.NET アプリケーションでの dotnet パッケージの追加 または パッケージの依存関係の管理」を参照してください。

使用例

プロジェクトの Program.cs ファイルで、 AddServiceDiscovery 拡張メソッドを呼び出して、サービス検出をホストに追加し、既定のサービス エンドポイント リゾルバーを構成します。

builder.Services.AddServiceDiscovery();

IHttpClientBuilder拡張メソッドを呼び出して、個々のAddServiceDiscoveryにサービス検出を追加します。

builder.Services.AddHttpClient<CatalogServiceClient>(static client =>
    {
        client.BaseAddress = new("https://catalog");
    })
    .AddServiceDiscovery();

または、既定ですべての HttpClient インスタンスにサービス検出を追加することもできます。

builder.Services.ConfigureHttpClientDefaults(static http =>
{
    // Turn on service discovery by default
    http.AddServiceDiscovery();
});

HTTP(S) エンドポイントを解決するときのスキームの選択

サービスをローカルで開発およびテストするときに HTTP を使用し、サービスをデプロイするときに HTTPS を使用するのが一般的です。 Service Discovery では、サービス探索に指定された入力文字列で URI スキームの優先順位リストを指定できるようにすることで、これをサポートしています。 Service Discovery は、スキームのサービスの解決を順番に試行し、エンドポイントが見つかった後に停止します。 URI スキームは、 + 文字 (例: "https+http://basket") で区切られます。 Service Discovery は、最初に "basket" サービスの HTTPS エンドポイントを検索し、次に HTTP エンドポイントにフォールバックします。 HTTPS エンドポイントが見つかった場合、サービス探索には HTTP エンドポイントは含まれません。

スキームは、AllowedSchemesAllowAllSchemesプロパティとServiceDiscoveryOptionsプロパティを構成することでフィルター処理できます。 AllowAllSchemes プロパティは、すべてのスキームが許可されていることを示すために使用されます。 既定では、 AllowAllSchemestrue され、すべてのスキームが許可されます。 スキームは、 AllowAllSchemesfalse に設定し、許可されたスキームを AllowedSchemes プロパティに追加することで制限できます。 たとえば、HTTPS のみを許可するには、次のようにします。

services.Configure<ServiceDiscoveryOptions>(options =>
{
    options.AllowAllSchemes = false;
    options.AllowedSchemes = ["https"];
});

すべてのスキームを明示的に許可するには、 ServiceDiscoveryOptions.AllowAllSchemes プロパティを trueに設定します。

services.Configure<ServiceDiscoveryOptions>(
    options => options.AllowAllSchemes = true);

構成からサービス エンドポイントを解決する

AddServiceDiscovery拡張メソッドは、既定で構成ベースのエンドポイント リゾルバーを追加します。 このリゾルバーは 、.NET 構成システムからエンドポイントを読み取ります。 ライブラリは、 appsettings.json、環境変数、またはその他の IConfiguration ソースを使用した構成をサポートします。

を使用して appsettings.json という名前のサービスのエンドポイントを構成する方法を示す例を次に示します。

{
  "Services": {
    "catalog": {
      "https": [
        "localhost:8080",
        "10.46.24.90:80"
      ]
    }
  }
}

前の例では、 catalog という名前のサービスに対して、 https://localhost:8080"https://10.46.24.90:80"の 2 つのエンドポイントを追加します。 カタログが解決されるたびに、これらのエンドポイントのいずれかが選択されます。

AddServiceDiscoveryCoreIServiceCollection拡張メソッドを使用してサービス検出がホストに追加された場合は、AddConfigurationServiceEndpointProviderIServiceCollection拡張メソッドを呼び出すことによって、構成ベースのエンドポイント リゾルバーを追加できます。

コンフィギュレーション

構成リゾルバーは、次の構成オプションを提供する ConfigurationServiceEndpointProviderOptions クラスを使用して構成されます。

  • SectionName: サービス エンドポイントを含む構成セクションの名前。 既定値は "Services"です。

  • ApplyHostNameMetadata: 解決されたエンドポイントにホスト名メタデータを適用する必要があるかどうかを判断するために使用されるデリゲート。 既定値は、 falseを返す関数です。

これらのオプションを構成するには、アプリケーションのConfigure クラスまたはIServiceCollection ファイル内のStartupProgram拡張メソッドを使用できます。

var builder = WebApplication.CreateBuilder(args);

builder.Services.Configure<ConfigurationServiceEndPointResolverOptions>(
    static options =>
    {
        options.SectionName = "MyServiceEndpoints";

        // Configure the logic for applying host name metadata
        options.ApplyHostNameMetadata = static endpoint =>
        {
            // Your custom logic here. For example:
            return endpoint.EndPoint is DnsEndPoint dnsEp
                && dnsEp.Host.StartsWith("internal");
        };
    });

前の例では、サービス エンドポイントのカスタム セクション名を設定し、ホスト名メタデータを適用するためのカスタム条件付きロジックを提供する方法を示します。

プラットフォーム提供のサービス検出を使用してサービス エンドポイントを解決する

Azure Container Apps や Kubernetes などの特定のプラットフォーム (適宜構成されている場合) では、サービス探索クライアント ライブラリを必要とせずにサービス検出機能を提供します。 このような環境にアプリケーションがデプロイされている場合は、プラットフォームの組み込み機能を使用すると便利です。 パススルー リゾルバーは、このシナリオを容易にするように設計されています。 これにより、開発者のコンピューターなどのさまざまな環境で、構成などの代替リゾルバーを利用できます。 重要なのは、コードの変更や条件付きガードの実装を必要とせずに、この柔軟性を実現することです。

パススルー リゾルバーは外部解決を実行せず、代わりに、 DnsEndPointとして表される入力サービス名を返すことによってエンドポイントを解決します。

パススルー プロバイダーは、 AddServiceDiscovery 拡張メソッドを使用してサービス検出を追加するときに、既定で構成されます。

AddServiceDiscoveryCoreIServiceCollection拡張メソッドを使用してホストにサービス検出が追加された場合は、AddPassThroughServiceEndpointProviderIServiceCollection拡張メソッドを呼び出すことによって、パススルー プロバイダーを追加できます。

こちらもご覧ください