次の方法で共有


.NET .NET Aspire サービスの検出

この記事では、.NET.NET Aspire プロジェクト内でのサービス検出のしくみについて説明します。 .NET .NET Aspire には、開発時とテスト時にサービス検出を構成するための機能が含まれています。 サービス検出機能は、 AppHost プロジェクトからアプリケーション モデルに追加された個々のサービス プロジェクトに 構成ベースのエンドポイント リゾルバーで想定される形式で構成を提供することによって機能します。 詳細については、「でのサービス検出 」を参照してください。

参照による暗黙的なサービス検出

サービス検出の構成は、特定のプロジェクトによって参照されるサービスに対してのみ追加されます。 たとえば、次の AppHost プログラムを考えてみましょう。

var builder = DistributedApplication.CreateBuilder(args);

var catalog = builder.AddProject<Projects.CatalogService>("catalog");
var basket = builder.AddProject<Projects.BasketService>("basket");

var frontend = builder.AddProject<Projects.MyFrontend>("frontend")
                      .WithReference(basket)
                      .WithReference(catalog);

前の例では、フロントエンド プロジェクトは、カタログ プロジェクトと バスケット プロジェクトを参照しています。 2 つの WithReference 呼び出しは、参照されているプロジェクト (カタログ、および バスケット) のサービス検出情報を フロントエンド プロジェクトに渡すように、.NET.NET Aspire プロジェクトに指示します。

名前付きエンドポイント

一部のサービスでは、複数の名前付きエンドポイントが公開されます。 名前付きエンドポイントは、HTTP 要求 URI のホスト部分で、scheme://_endpointName.serviceName形式に従ってエンドポイント名を指定することで解決できます。 たとえば、"basket" という名前のサービスが "dashboard" という名前のエンドポイントを公開している場合、URI scheme+http://_dashboard.basket を使用してこのエンドポイントを指定できます。次に例を示します。

builder.Services.AddHttpClient<BasketServiceClient>(
    static client => client.BaseAddress = new("https+http://basket"));

builder.Services.AddHttpClient<BasketServiceDashboardClient>(
    static client => client.BaseAddress = new("https+http://_dashboard.basket"));

前の例では、2 つの HttpClient クラスが追加されています。1 つはコア バスケット サービス用、もう 1 つはバスケット サービスのダッシュボード用です。

構成を使用した名前付きエンドポイント

構成ベースのエンドポイント リゾルバーを使用すると、エンドポイント値の前に _endpointName.(エンドポイント名) を付けることで、名前付きエンドポイント endpointName 指定できます。 たとえば、既定のエンドポイント (名前なし) と "dashboard" という名前のエンドポイントを定義した、次の appsettings.json 構成について考えてみましょう。

{
  "Services": {
    "basket":
      "https": "https://10.2.3.4:8080", /* the https endpoint, requested via https://basket */
      "dashboard": "https://10.2.3.4:9999" /* the "dashboard" endpoint, requested via https://_dashboard.basket */
    }
  }
}

上記の JSON:

  • https://basket 解決時の既定のエンドポイントは 10.2.3.4:8080
  • https://_dashboard.basket を介して解決された "ダッシュボード" エンドポイントは 10.2.3.4:9999

.NET .NET Aspire の名前付きエンドポイント

var basket = builder.AddProject<Projects.BasketService>("basket")
    .WithHttpsEndpoint(hostPort: 9999, name: "dashboard");

DNS SRV を使用した Kubernetes の名前付きエンドポイント

Kubernetesにデプロイする場合、DNS SRV サービス エンドポイント リゾルバーを使用して名前付きエンドポイントを解決できます。 たとえば、次のリソース定義では、"default" という名前のエンドポイントと "dashboard" という名前のエンドポイントに対して DNS SRV レコードが作成され、両方とも "basket" という名前のサービス上に作成されます。

apiVersion: v1
kind: Service
metadata:
  name: basket
spec:
  selector:
    name: basket-service
  clusterIP: None
  ports:
  - name: default
    port: 8080
  - name: dashboard
    port: 9999

"basket" サービスの "ダッシュボード" エンドポイントを解決するようにサービスを構成するには、次のように DNS SRV サービス エンドポイント リゾルバーをホスト ビルダーに追加します。

builder.Services.AddServiceDiscoveryCore();
builder.Services.AddDnsSrvServiceEndpointProvider();

詳細については、「AddServiceDiscoveryCoreAddDnsSrvServiceEndpointProvider」を参照してください。

特殊なポート名 "default" は、URI https://basketを使用して解決される既定のエンドポイントを指定するために使用されます。

前の例と同様に、バスケット サービスの HttpClient にサービス検出を追加します。

builder.Services.AddHttpClient<BasketServiceClient>(
    static client => client.BaseAddress = new("https://basket"));

同様に、"ダッシュボード" エンドポイントは次のようにターゲットにすることができます。

builder.Services.AddHttpClient<BasketServiceDashboardClient>(
    static client => client.BaseAddress = new("https://_dashboard.basket"));

関連項目