.NET Aspire Dapr 統合
分散アプリケーション ランタイム (Dapr) は、他のサービスや依存関係と対話するためのコンジットとして機能し、それらのサービスと依存関係の詳細からアプリケーションを抽象化する開発者 API を提供します。 Dapr と .NET Aspire が連携して、ローカル開発エクスペリエンスを向上させることができます。 .NET Aspireで Dapr を使用することで、ローカルのオンボーディングではなく、.NETベースの分散アプリケーションの作成と実装に集中できます。
このガイドでは、Daprの抽象化と .NET Aspireのクラウド テクノロジのオピニオン構成を利用して、シンプルで移植性があり、回復性があり、セキュリティで保護されたマイクロサービスを大規模に構築する方法について説明します。
.NET Aspire と Dapr の比較
一目で Dapr と .NET Aspire は、機能が重複しているように見える場合があります。 ただし、異なるアプローチを取ります。 .NET .NET Aspire は、クラウド プラットフォーム上で分散アプリケーションを構築する方法について意見を持ち、ローカル開発エクスペリエンスの向上に重点を置いています。 Dapr は、開発中と運用環境の両方で、基になるクラウド プラットフォームの一般的な複雑さを抽象化するランタイムです。 サイドカーに依存して、構成、シークレット管理、メッセージングなどの抽象化を提供します。 基になるテクノロジは構成ファイルを使用して簡単に切り替えることができますが、コードを変更する必要はありません。
アスペクト | .NET Aspire | Dapr |
---|---|---|
目的 | ローカル開発コンピューターでクラウドネイティブ ソリューションを簡単に開発できるように設計されています。 | 簡単にスワップできる一般的な API を使用して、分散アプリの開発と実行を容易にできるように設計されています。 |
API | 開発者は、特定の SDK を使用してリソース API を呼び出す必要があります | 開発者は、Dapr サイドカーで API を呼び出し、これにより呼び出しが正しい API に転送されます。 マイクロサービスのコードを変更することなく、リソース API を簡単にスワップできます。 |
言語 | マイクロサービスは、.NET 言語、Go、Python、Javascript などを使用して記述します。 | Dapr サイドカー関数は、HTTP/gRPC インターフェイスをサポートする任意の言語で呼び出すことができます。 |
セキュリティ ポリシー | セキュリティ ポリシーは含まれませんが、依存リソース間の接続を安全に構成できます。 | 他のサービスまたはリソースにアクセスできるマイクロサービスを制御するカスタマイズ可能なセキュリティ ポリシーが含まれます。 |
配備 | Azure と Kubernetes用の展開ツールがあります。 | 展開ツールは含まれません。 アプリは通常、継続的インテグレーション/継続的開発 (CI/CD) システムと共にデプロイされます。 |
ダッシュボード | リソースとそのテレメトリの包括的なビューを提供し、OTEL でサポートされているリソースのリッスンをサポートします。 | Dapr リソースのみに制限されます。 |
.NET Aspire では、Dapr サイドカーを構成する簡単な API を提供し、サイドカーをリソースとしてダッシュボードに公開することで、Dapr アプリケーションの設定とデバッグを容易にします。
Dapr を使用して .NET Aspire コンポーネントを調べる
Dapr には多くの 組み込みコンポーネントが用意されており、Dapr で .NET Aspire を使用すると、これらのコンポーネントを簡単に探索して構成できます。 これらのコンポーネントを .NET.NET Aspire 統合と混同しないでください。 たとえば、次の点を考えてみましょう。
- Dapr—状態ストア: AddDaprStateStore を呼び出して、構成済みの状態ストアを .NET.NET Aspire プロジェクトに追加します。
- Dapr—Pub Sub: AddDaprPubSub を呼び出して、構成済みの pub sub を .NET.NET Aspire プロジェクトに追加します。
- Dapr—コンポーネント: AddDaprComponent を呼び出して、構成済みの統合を .NET.NET Aspire プロジェクトに追加します。
Dapr のインストール
この統合には、バージョン 1.13 以降 Dapr 必要です。 dapr init
を実行し、ローカル環境で Dapr を初期化します。
大事な
Dapr CLI を使用せずに .NET Aspire ソリューションを実行しようとすると、次のエラーが表示されます。
Unable to locate the Dapr CLI.
ホスティング統合
.NET Aspire ソリューションで、Dapr を統合してその型と API にアクセスするには、📦Aspire.Hosting.Dapr NuGet パッケージを アプリ ホスト プロジェクトに追加します。
dotnet add package Aspire.Hosting.Dapr
詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。
Dapr サイドカーを .NET Aspire リソースに追加する
Dapr では、サイドカー パターンを使用します。 Dapr サイドカーは、軽量で移植可能でステートレスな HTTP サーバーとしてアプリと共に実行され、アプリからの受信 HTTP 要求をリッスンします。
サイドカーを .NET.NET Aspire リソースに追加するには、その WithDaprSidecar メソッドを呼び出します。
appId
パラメーターは、Dapr アプリケーションの一意の識別子ですが、任意です。
appId
を指定しない場合は、代わりに親リソース名が使用されます。
using Aspire.Hosting.Dapr;
var builder = DistributedApplication.CreateBuilder(args);
var apiService = builder
.AddProject<Projects.Dapr_ApiService>("apiservice")
.WithDaprSidecar();
Dapr のサイドカーを構成する
WithDaprSidecar
メソッドは、AppId
やさまざまなポートなどの Dapr サイドカー オプションを構成するためのオーバーロードを提供します。 次の例では、Dapr サイドカーは、GRPC、HTTP、メトリック、および特定のアプリ ID 用の特定のポートで構成されています。
DaprSidecarOptions sidecarOptions = new()
{
AppId = "FirstSidecar",
DaprGrpcPort = 50001,
DaprHttpPort = 3500,
MetricsPort = 9090
};
builder.AddProject<Projects.Dapr_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(apiService)
.WithDaprSidecar(sidecarOptions);
Dapr アプリホストの例を完了する
すべてをまとめる場合は、次の例を含む .NET.NET Aspire アプリ ホスト プロジェクトを考えてみましょう。
- デフォルトで Dapr サイドカーを宣言するバックエンド API サービス。
- 特定のオプション (例: explict ポート) を使用して Dapr サイドカーを宣言する Web フロントエンド プロジェクト。
using Aspire.Hosting.Dapr;
var builder = DistributedApplication.CreateBuilder(args);
var apiService = builder
.AddProject<Projects.Dapr_ApiService>("apiservice")
.WithDaprSidecar();
DaprSidecarOptions sidecarOptions = new()
{
AppId = "FirstSidecar",
DaprGrpcPort = 50001,
DaprHttpPort = 3500,
MetricsPort = 9090
};
builder.AddProject<Projects.Dapr_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(apiService)
.WithDaprSidecar(sidecarOptions);
builder.Build().Run();
.NET Aspire ソリューションを開始すると、ダッシュボードに Dapr サイドカーがリソースとして表示され、その状態とログが表示されます。
.NET Aspire プロジェクトで Dapr サイドカーを使用する
.NET Aspire リソースから Dapr API を利用するには、📦Daprと AspNetCore/ NuGet パッケージを使用してください。 Dapr SDK には、Dapr サイドカーと対話するための一連の API が用意されています。
手記
Dapr.AspNetCore
との Dapr 統合 (DI 統合、サブスクリプションの登録など) には、ASP.NET ライブラリを使用します。
ASP.NET 以外のアプリ (コンソール アプリなど) は、📦。
dotnet add package Dapr.AspNetCore
クライアント Dapr 追加する
ASP.NET Core プロジェクトにインストールすると、SDK をサービス ビルダーに追加できます。
builder.Services.AddDaprClient();
Dapr メソッドを呼び出す
DaprClient
のインスタンスをサービスに挿入して、Dapr SDK を介して Dapr サイドカーと対話できるようになりました。
using Dapr.Client;
namespace Dapr.Web;
public class WeatherApiClient(DaprClient client)
{
public async Task<WeatherForecast[]> GetWeatherAsync(
int maxItems = 10, CancellationToken cancellationToken = default)
{
List<WeatherForecast>? forecasts =
await client.InvokeMethodAsync<List<WeatherForecast>>(
HttpMethod.Get,
"apiservice",
"weatherforecast",
cancellationToken);
return forecasts?.Take(maxItems)?.ToArray() ?? [];
}
}
public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
InvokeMethodAsync
は、Dapr サイドカーに HTTP 要求を送信するメソッドです。 これは、以下を受け取る一般的なメソッドです。
- HTTP 動詞。
- 呼び出すサービスの Dapr アプリ ID。
- メソッド名。
- キャンセル トークン。
HTTP 動詞によっては、要求本文とヘッダーを受け取ることもできます。 ジェネリック型パラメーターは、応答本文の型です。
フロントエンド プロジェクトの完全な Program.cs ファイルには、次の情報が表示されます。
- サービス ビルダーに追加される Dapr クライアント。
-
Dapr クライアントを使用してバックエンド サービスを呼び出す
WeatherApiClient
クラス。
using Dapr.Web;
using Dapr.Web.Components;
var builder = WebApplication.CreateBuilder(args);
// Add service defaults & Aspire components.
builder.AddServiceDefaults();
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddOutputCache();
builder.Services.AddDaprClient();
builder.Services.AddTransient<WeatherApiClient>();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseAntiforgery();
app.UseOutputCache();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapDefaultEndpoints();
app.Run();
たとえば、Blazor プロジェクトでは、WeatherApiClient
クラスを Razor ページに挿入し、それを使用してバックエンド サービスを呼び出すことができます。
@page "/weather"
@attribute [StreamRendering(true)]
@attribute [OutputCache(Duration = 5)]
@inject WeatherApiClient WeatherApi
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data loaded from a backend API service.</p>
@if (forecasts == null)
{
<p><em>Loading...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Date</th>
<th>Temp. (C)</th>
<th>Temp. (F)</th>
<th>Summary</th>
</tr>
</thead>
<tbody>
@foreach (var forecast in forecasts)
{
<tr>
<td>@forecast.Date.ToShortDateString()</td>
<td>@forecast.TemperatureC</td>
<td>@forecast.TemperatureF</td>
<td>@forecast.Summary</td>
</tr>
}
</tbody>
</table>
}
@code {
private WeatherForecast[]? forecasts;
protected override async Task OnInitializedAsync()
{
forecasts = await WeatherApi.GetWeatherAsync();
}
}
Dapr SDK を使用すると、Dapr サイドカーが HTTP 経由で呼び出されます。 その後、Dapr サイドカーは、要求をターゲット サービスに転送します。 ターゲット サービスはサイドカーとは別のプロセスで実行されますが、サービスに関連する統合は Dapr サイドカーで実行され、サービスの検出とターゲット サービスへの要求のルーティングを担当します。
次の手順
.NET Aspire