Użyj Dapr z .NET Aspire
Środowisko Uruchomieniowe Aplikacji Rozproszonej (Dapr) oferuje interfejsy API dla deweloperów, które służą jako kanał umożliwiający interakcję z innymi usługami i zależnościami, a także abstrahują aplikację od specyfiki tych usług i zależności. Dapr i .NET Aspire współpracują, aby poprawić lokalne środowisko programistyczne. Używając Dapr z .NET Aspire, możesz skoncentrować się na pisaniu i implementowaniu aplikacji rozproszonych opartych na .NETzamiast poświęcać dodatkowy czas na lokalne wprowadzanie.
W tym przewodniku dowiesz się, jak wykorzystać abstrakcję Daproraz charakterystyczną konfigurację .NET Aspiretechnologii chmurowych do tworzenia mikrousług na dużą skalę, które są proste, przenośne, odporne i zabezpieczone na Azure.
Warunki wstępne
Aby pracować z .NET.NET Aspire, musisz mieć zainstalowane następujące rzeczy lokalnie:
- .NET 8.0 lub .NET 9.0
- Środowisko uruchomieniowe kontenera zgodne ze standardem OCI, takie jak:
- Docker Desktop lub Podman. Aby uzyskać więcej informacji, zobacz Container Runtime.
- Zintegrowane środowisko deweloperskie (IDE) lub edytor kodu, takie jak:
- Visual Studio 2022 w wersji 17.9 lub nowszej (opcjonalnie)
-
Visual Studio Code (opcjonalnie)
- C# Dev Kit: Rozszerzenie (opcjonalne)
- JetBrains Rider z opcjonalną wtyczką .NET.NET Aspire
Aby uzyskać więcej informacji, zobacz .NET.NET Aspire setup and toolingi .NET.NET Aspire SDK.
Oprócz wymagań wstępnych dotyczących .NET.NET Aspire, będziesz potrzebować następujących elementów:
- Dapr w wersji 1.13 lub nowszej
Aby zainstalować Dapr, zobacz Install the Dapr CLI(Instalowanie interfejsu wiersza polecenia Dapr). Po zainstalowaniu interfejsu wiersza polecenia Dapr, uruchom opisane dapr init
w sekcji "Inicjowanie Dapr" w swoim lokalnym środowisku.
Ważny
Jeśli spróbujesz uruchomić aplikację bez interfejsu wiersza polecenia Dapr, zostanie wyświetlony następujący błąd:
Unable to locate the Dapr CLI.
Zacznij
Aby rozpocząć, musisz dodać pakiet hostingowy Dapr do projektu hosta aplikacji, instalując pakiet NuGet 📦Aspire.Hosting.Dapr.
- .NET interfejsu wiersza polecenia
- PackageReference
dotnet add package Aspire.Hosting.Dapr
Aby uzyskać więcej informacji, zobacz dotnet add package lub Zarządzaj zależnościami pakietów w .NET aplikacjach.
Dodaj wózek boczny Dapr
Dapr używa wzorca przyczepki do uruchamiania obok aplikacji. Dapr sidecar działa obok aplikacji jako lekki, przenośny i bezstanowy serwer HTTP server, który nasłuchuje przychodzących żądań HTTP do twojej aplikacji.
Aby dodać przyczepkę do zasobu .NET.NET Aspire, wywołaj metodę WithDaprSidecar dla żądanego zasobu. Parametr appId
jest unikatowym identyfikatorem aplikacji Dapr, ale jest opcjonalny. Jeśli nie podasz appId
, zamiast tego zostanie użyta nazwa zasobu nadrzędnego.
using Aspire.Hosting.Dapr;
var builder = DistributedApplication.CreateBuilder(args);
var apiService = builder
.AddProject<Projects.Dapr_ApiService>("apiservice")
.WithDaprSidecar();
Metoda WithDaprSidecar
oferuje przeciążenia, aby skonfigurować opcje Dapr przyczepki, takie jak identyfikator aplikacji i porty. W poniższym przykładzie moduł sidecar Dapr jest skonfigurowany do pracy z określonymi portami dla gRPC, HTTP, metryk oraz określonym identyfikatorem aplikacji.
DaprSidecarOptions sidecarOptions = new()
{
DaprGrpcPort = 50001,
DaprHttpPort = 3500,
MetricsPort = 9090
};
builder.AddProject<Projects.Dapr_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(apiService)
.WithDaprSidecar(sidecarOptions);
Rozważmy następujący przykład projektu hosta aplikacji .NET.NET Aspire, który obejmuje:
- Interfejs API backendu, który deklaruje kontener towarzyszący Dapr z ustawieniami domyślnymi.
- Frontend, który deklaruje sidecar Dapr z określonymi opcjami, takimi jak jawne porty.
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();
Panel kontrolny .NET Aspire przedstawia Dapr sidecar jako zasób z jego statusem i dziennikami.
Dodawanie zestawu SDK Dapr
Aby użyć interfejsów API Dapr z zasobów .NET Aspire, możesz użyć 📦Dapr. AspNetCore/. Zestaw SDK Dapr udostępnia zestaw interfejsów API do interakcji z Dapr przyczepkami.
Notatka
Użyj biblioteki Dapr.AspNetCore
na potrzeby integracji Dapr z ASP.NET (integracja DI, rejestracja subskrypcji itp.). Aplikacje inne niżASP.NET (takie jak aplikacje konsolowe) mogą po prostu używać 📦Dapr.Client, aby wykonywać wywołania za pośrednictwem modułu dodatkowego Dapr.
- .NET interfejsu wiersza polecenia
- PackageReference
dotnet add package Dapr.AspNetCore
Po zainstalowaniu w projekcie ASP.NET Core zestaw SDK można dodać do generatora usług.
builder.Services.AddDaprClient();
Instancję DaprClient
można teraz wstrzyknąć do usług, aby współdziałać z sidecarem Dapr za pośrednictwem 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
to metoda, która wysyła żądanie HTTP do Dapr sidekara. Jest to metoda ogólna, która przyjmuje:
- Czasownik HTTP
- Identyfikator aplikacji usługi Dapr, którą należy wywołać
- Nazwa metody
- Token anulowania
W zależności od czasownika HTTP może on również przyjmować treść żądania i nagłówki. Ogólny parametr typu jest typem treści odpowiedzi.
Pełny plik Program.cs dla projektu frontendowego pokazuje:
- Dapr client dodawane do narzędzia do budowy usług
- Klasa
WeatherApiClient
, która używa Daprclient do wywoływania usługi zaplecza
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();
Na przykład w projekcie Blazor klasę WeatherApiClient
można wstrzyknąć do integracji i użyć do wywołania usługi backendowej.
@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();
}
}
Gdy jest używany zestaw SDK Dapr, Dapr przyczepka jest wywoływana za pośrednictwem protokołu HTTP. Przyczepka Dapr następnie przekazuje żądanie do usługi docelowej. Podczas gdy usługa docelowa działa w osobnym procesie niż sidecar, integracja związana z usługą działa w sidecarze Dapr i jest odpowiedzialna za odkrywanie usług oraz kierowanie żądań do usługi docelowej.
Dapr i .NET Aspire
Na pierwszy rzut oka Dapr i .NET Aspire mogą wyglądać tak, jakby miały nakładające się funkcje i działają. Jednak obaj przyjmują inne podejście. .NET .NET Aspire to subiektywne podejście do tworzenia aplikacji rozproszonych na chmurze. Dapr to środowisko uruchomieniowe, które abstrahuje od typowych złożoności podstawowej platformy w chmurze. Opiera się on na sidecarach, aby zapewnić abstrakcje dla takich elementów, jak konfiguracja, zarządzanie tajemnicami i obsługa komunikatów. Podstawowa technologia może być łatwo przełączana za pośrednictwem plików konfiguracji, podczas gdy kod nie musi się zmieniać.
.NET Aspire ułatwia konfigurowanie i debugowanie aplikacji Dapr, zapewniając prosty interfejs API do konfigurowania Dapr przyczepek oraz uwidaczniając przyczepki jako zasoby na pulpicie nawigacyjnym.
Eksplorowanie składników Dapr za pomocą .NET Aspire
Dapr udostępnia wiele wbudowanych składników , a w przypadku korzystania z Dapr z .NET Aspire można łatwo eksplorować i konfigurować te składniki. Nie należy mylić tych składników z integracją .NET.NET Aspire. Rozważmy na przykład następujące kwestie:
- Dapr— magazyny stanów: wywołaj AddDaprStateStore, aby dodać skonfigurowany magazyn stanów do projektu .NET.NET Aspire.
- Dapr— Pub Sub: wywołaj AddDaprPubSub, aby dodać skonfigurowany Pub Sub do projektu .NET.NET Aspire.
- Dapr— składniki: wywołaj AddDaprComponent, aby dodać skonfigurowaną integrację do projektu .NET.NET Aspire.
Następne kroki
przykładowa aplikacja .NET AspireDapr