共用方式為


使用 Dapr 搭配 .NET Aspire

分散式應用程式執行階段(Dapr) 提供開發人員 API,作為與其他服務和相依性互動的介面,並將應用程式從這些服務和相依性的特定內容中抽象化。 Dapr 和 .NET Aspire 共同合作,以改善您的本機開發體驗。 藉由與 Dapr搭配使用 .NET Aspire,您可以專注於撰寫和實作基於 .NET的分散應用程式,而非花費額外時間在本地上手過程上。

在本指南中,您將瞭解如何利用 Dapr的抽象概念和 .NET Aspire的有意見的雲端技術組態,在 Azure上大規模建置簡單、可攜、具彈性且安全的微服務。

先決條件

為了能夠與 .NET.NET Aspire一起工作,您需要在本地端安裝以下項目:

如需詳細資訊,請參閱 .NET.NET Aspire 設定和工具.NET.NET Aspire SDK

除了 .NET.NET Aspire的必要條件之外,您還需要:

  • Dapr 1.13 版或更新版本

若要安裝 Dapr,請參閱 安裝 Dapr CLI。 安裝 CLI 後,請在本地環境中執行 Initialize 所描述的

重要

如果您試著在沒有 Dapr CLI 的情況下執行應用程式,您將會收到下列錯誤:

Unable to locate the Dapr CLI.

開始使用

若要開始,您需要透過安裝 Dapr NuGet 套件,將 裝載套件新增至您的應用程式主機專案。

dotnet add package Aspire.Hosting.Dapr

如需詳細資訊,請參閱 dotnet add package管理 .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 方法提供多載來設定 Dapr 側車選項,例如應用程式識別碼和埠。 在下列範例中,Dapr 側車配置了特定的埠來支持 GRPC、HTTP、計量,以及特定的應用程式識別碼。

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

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

將所有專案放在一起,請考慮下列包含 .NET.NET Aspire 應用程式主機專案的範例:

  • 後端 API,宣告具有預設值的 Dapr 側車。
  • 宣告具有特定選項之 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 sidecar 顯示為資源,並包括其狀態和日誌。

.NET Aspire 儀錶板顯示 Dapr 側車資源

新增 Dapr SDK

若要從 Dapr 資源使用 .NET Aspire API,您可以使用 📦Dapr.AspNetCore/。 Dapr SDK 提供一組 API 來與 Dapr 側車互動。

注意

使用 Dapr.AspNetCore 連結庫進行 Dapr 與 ASP.NET 整合(DI 整合、訂用帳戶註冊等)。 非ASP.NET 應用程式(例如主控台應用程式)只能使用 📦Dapr。Client 通過 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 是將 HTTP 要求傳送至 Dapr 側車的方法。 這是一般方法,採用:

  • HTTP 動詞
  • 要呼叫的服務 Dapr 應用程式識別碼
  • 方法名稱
  • 取消令牌

根據 HTTP 動詞,它也可以帶有請求體和標頭。 泛型類型參數是響應主體的類型。

前端專案的完整 Program.cs 檔案會顯示:

  • 要新增到服務產生器的元素 Daprclient
  • 使用 WeatherApiClientDapr 呼叫後端服務的 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 時,會透過 HTTP 呼叫 Dapr 側車。 然後,Dapr 側車會將要求轉送至目標服務。 當目標服務在與 Sidecar 不同的進程中運行時,與服務相關的集成會在 Dapr 側車中運行,負責服務發現並將請求路由至目標服務。

Dapr 和 .NET Aspire

乍看之下,Dapr 和 .NET Aspire 功能可能有重疊,而且確實如此。 不過,兩者都採用不同的方法。 .NET .NET Aspire 是關於如何在雲端平臺上建置分散式應用程式的有意見方法。 Dapr 是一種運行時環境,可將基礎雲端平台的常見複雜性抽象化。 它依賴sidecars來提供設定、機密管理和傳訊等的抽象。 您可以透過組態檔輕鬆地切換基礎技術,而您的程式代碼不需要變更。

.NET Aspire 提供簡單的 API 來設定 Dapr 側車,並將側車作為資源在儀錶板中公開展示,使 Dapr 應用程式的設定和偵錯變得更容易。

使用 Dapr 探索 .NET Aspire 元件

Dapr 提供許多 內建元件,當您使用 Dapr 搭配 .NET Aspire 時,您可以輕鬆地探索和設定這些元件。 請勿將這些元件與 .NET.NET Aspire 整合混淆。 例如,請考慮下列事項:

後續步驟