.NET Aspire Dapr 整合
分散式應用程式執行階段(Dapr) 提供開發人員 API,作為與其他服務和相依性互動的介面,並將應用程式從這些服務和相依性的特定內容中抽象化。 Dapr 和 .NET Aspire 可以合作,改善您的本機開發體驗。 藉由使用 Dapr 搭配 .NET Aspire,您可以專注於撰寫和實作以 .NET為基礎的分散式應用程式,而不是本機上線。
在本指南中,您將瞭解如何利用 Dapr的抽象概念和 .NET Aspire的有意見的雲端技術組態,大規模建置簡單、可攜式、具彈性且安全的微服務。
比較 .NET Aspire 和 Dapr
乍看之下,Dapr 和 .NET Aspire 功能可能有重疊,而且確實如此。 不過,它們採用不同的方法。 .NET .NET Aspire 對於如何在雲端平台上構建分散式應用程式有其獨到見解,專注於改善本地開發環境的體驗。 Dapr 是一個運行環境,在開發和生產環境中簡化了基礎雲端平臺的常見複雜性。 它依賴sidecars來提供設定、機密管理和傳訊等的抽象。 您可以透過組態檔輕鬆地切換基礎技術,而您的程式代碼不需要變更。
方面 | .NET Aspire | Dapr |
---|---|---|
目的 | 設計目的是讓您更輕鬆地在本機開發電腦上開發雲端原生解決方案。 | 設計成可讓您更輕鬆地使用可輕鬆交換的常見 API 來開發和執行分散式應用程式。 |
API | 開發人員必須使用其特定的 SDK 來呼叫資源 API | 開發人員會在 Dapr 側車中呼叫 API,以將呼叫轉送至正確的 API。 您可以輕鬆地交換資源 API,而不需要變更微服務中的程式碼。 |
語言 | 您可以使用 .NET 語言、Go、Python、Javascript 和其他語言撰寫微服務。 | 您可以使用任何支援 HTTP/gRPC 介面的語言呼叫 Dapr Sidecar 函式。 |
安全策略 | 不包含安全策略,但可以安全地設定相依資源之間的連線。 | 包含可自定義的安全策略,可控制哪些微服務可以存取其他服務或資源。 |
部署 | 有適用於 Azure 和 Kubernetes的部署工具。 | 不包含部署工具。 應用程式通常會使用持續整合/持續開發 (CI/CD) 系統進行部署。 |
儀表板 | 提供對資源及其遙測的全方面檢視,並支援監聽任何 OpenTelemetry 支援的資源。 | 僅限 Dapr 資源。 |
.NET Aspire 提供簡單的 API 來設定 Dapr 側車,並將側車作為資源在儀錶板中公開展示,使 Dapr 應用程式的設定和偵錯變得更容易。
使用 Dapr 探索 .NET Aspire 元件
Dapr 提供許多 內建元件,當您使用 Dapr 搭配 .NET Aspire 時,您可以輕鬆地探索和設定這些元件。 請勿將這些元件與 .NET.NET Aspire 整合混淆。 例如,請考慮下列事項:
- Dapr—狀態存放區:呼叫 AddDaprStateStore,將設定的狀態存放區新增至您的 .NET.NET Aspire 專案。
- Dapr— 發布/訂閱:呼叫 AddDaprPubSub,將配置的發布/訂閱新增至您的 .NET.NET Aspire 專案。
- Dapr- 元件:呼叫 AddDaprComponent,將已設定的整合新增至您的 .NET.NET Aspire 專案。
安裝 Dapr
此整合需要 Dapr 1.13 版或更新版本。 若要安裝 Dapr,請參閱 安裝 Dapr CLI。 安裝 Dapr CLI 之後,請執行 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 add package 或 管理 .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
方法提供重載來設定 Dapr 側車選項,例如 AppId
和各種埠。 在下列範例中,Dapr 側車配置了特定的埠來支持 GRPC、HTTP、計量,以及特定的應用程式識別碼。
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 應用程式主機專案的範例:
- 後端 API 服務,宣告具有預設值的 Dapr 側車。
- Web 前端專案,宣告具有特定選項的 Dapr Sidecar,例如明確的端口。
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 sidecar 作為資源,並展示其狀態和日誌。
使用 Dapr 側車於 .NET Aspire 專案中
若要從 .NET Aspire 資源使用 Dapr API,您可以使用 📦Dapr。AspNetCore/ NuGet 套件。 Dapr SDK 提供一組 API 來與 Dapr 側車互動。
注意
使用 Dapr.AspNetCore
連結庫進行 Dapr 與 ASP.NET 整合(DI 整合、訂用帳戶註冊等)。 非ASP.NET 應用程式(例如主控台應用程式)只能使用 📦Dapr。Client 通過 Dapr 側車撥打電話。
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
是將 HTTP 要求傳送至 Dapr 側車的方法。 這是一般方法,採用:
- HTTP 動詞
- 要呼叫的服務 Dapr 應用程式識別碼。
- 方法名稱。
- 取消標記。
根據 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 時,會透過 HTTP 呼叫 Dapr 側車。 然後,Dapr 側車會將要求轉送至目標服務。 當目標服務在與 Sidecar 不同的進程中運行時,與服務相關的集成會在 Dapr 側車中運行,負責服務發現並將請求路由至目標服務。