.NET .NET Aspire サービスの検出
この記事では、.NET.NET Aspire プロジェクト内でのサービス検出のしくみについて説明します。
.NET
.NET Aspire には、開発時とテスト時にサービス検出を構成するための機能が含まれています。 サービス検出機能は、
参照による暗黙的なサービス検出
サービス検出の構成は、特定のプロジェクトによって参照されるサービスに対してのみ追加されます。 たとえば、次の 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();
詳細については、「AddServiceDiscoveryCore と AddDnsSrvServiceEndpointProvider」を参照してください。
特殊なポート名 "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"));
関連項目
- の .NET におけるサービス検出
- HttpClient クラスを使用して HTTP 要求を行
- IHttpClientFactory を .NET と共に使用する
.NET Aspire