次の方法で共有


Dapr を .NET Aspire で使用する

分散アプリケーション ランタイム (Dapr) は、他のサービスや依存関係と対話するためのコンジットとして機能し、それらのサービスと依存関係の詳細からアプリケーションを抽象化する開発者 API を提供します。 Dapr と .NET Aspire が連携して、ローカル開発エクスペリエンスを向上させます。 Daprで .NET Aspire を使用することで、ローカル オンボードに余分な時間を費やすのではなく、.NETベースの分散アプリケーションの作成と実装に集中できます。

このガイドでは、Daprの抽象化と .NET Aspireのクラウド テクノロジのオピニオン構成を利用して、Azureで大規模にシンプルで移植性があり、回復性があり、セキュリティで保護されたマイクロサービスを構築する方法について説明します。

前提 条件

.NET .NET Aspireを使用するには、次のものがローカルにインストールされている必要があります。

詳細については、 セットアップとツールの、および SDK を参照してください。

.NET .NET Aspireの前提条件に加えて、次のものが必要です。

  • Dapr バージョン 1.13 以降

をインストールするには、「 CLIのインストール を参照してください。 Dapr CLI をインストールした後、「ローカル環境で dapr init を初期化 Dapr」で説明されている を実行します。

大事な

Dapr CLI なしでアプリを実行しようとすると、次のエラーが表示されます。

Unable to locate the Dapr CLI.

作業の開始

開始するには、 NuGet パッケージである .Hosting をインストールして、 ホスティング パッケージをアプリホストプロジェクトに追加する必要があります。

dotnet add package Aspire.Hosting.Dapr

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

Dapr サイドカーを追加する

あなたのアプリケーションと共に実行するために、Dapr では、サイドカー パターン を使用します。 Dapr サイドカーは、軽量で移植可能でステートレスな HTTP server としてアプリと共に実行され、アプリからの受信 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();

WithDaprSidecar メソッドは、アプリ ID やポートなどの Dapr サイドカー オプションを構成するためのオーバーロードを提供します。 次の例では、Dapr サイドカーは、GRPC、HTTP、メトリック、および特定のアプリ ID 用の特定のポートで構成されています。

DaprSidecarOptions sidecarOptions = new()
{
    DaprGrpcPort = 50001,
    DaprHttpPort = 3500,
    MetricsPort = 9090
};

builder.AddProject<Projects.Dapr_Web>("webfrontend")
    .WithExternalHttpEndpoints()
    .WithReference(apiService)
    .WithDaprSidecar(sidecarOptions);

すべてをまとめる場合は、次の例を含む .NET.NET Aspire アプリ ホスト プロジェクトを考えてみましょう。

  • 既定で Dapr サイドカーを宣言するバックエンド API。
  • 特定のオプション (例: explict ポート) を持つ Dapr サイドカーを宣言するフロントエンド。
using Aspire.Hosting.Dapr;

var builder = DistributedApplication.CreateBuilder(args);

var apiService = builder
    .AddProject<Projects.Dapr_ApiService>("apiservice")
    .WithDaprSidecar();

DaprSidecarOptions sidecarOptions = new()
{
    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 が表示されています。

Dapr SDK の追加

Dapr リソースから .NET Aspire API を使用するには、📦Daprを使用します。AspNetCore/. Dapr SDK には、Dapr サイドカーと対話するための一連の API が用意されています。

手記

Dapr.AspNetCore との Dapr 統合 (DI 統合、サブスクリプションの登録など) には、ASP.NET ライブラリを使用します。 ASP.NET 以外のアプリ (コンソール アプリなど) は、Dapr。

dotnet add package Dapr.AspNetCore

ASP.NET Core プロジェクトにインストールすると、SDK をサービス ビルダーに追加できます。

builder.Services.AddDaprClient();

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 動詞
  • 呼び出すサービスのアプリID Dapr
  • メソッド名
  • キャンセル トークン

HTTP 動詞によっては、要求本文とヘッダーを受け取ることもできます。 ジェネリック型パラメーターは、応答本文の型です。

フロントエンド プロジェクトの完全な Program.cs ファイルには、次の情報が表示されます。

  • サービス ビルダーに Daprclient が追加される
  • WeatherApiClient Dapr を使用してバックエンド サービスを呼び出す client クラス
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 クラスを統合に挿入し、バックエンド サービスの呼び出しに使用できます。

@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 サイドカーで実行され、サービスの検出とターゲット サービスへの要求のルーティングを担当します。

Dapr と .NET Aspire

一目で Dapr と .NET Aspire は、機能が重複しているように見える場合があります。 ただし、どちらも異なるアプローチを採用しています。 .NET .NET Aspire は、クラウド プラットフォームで分散アプリケーションを構築する方法に関するオピニオンアプローチです。 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 プロジェクトに追加します。

次の手順