Delen via


integratie van .NET AspireDapr

Distributed Application Runtime (Dapr) biedt ontwikkelaars-API's die fungeren als een kanaal voor interactie met andere services en afhankelijke modules en haalt de toepassing los van de specifieke kenmerken van deze services en modules. Dapr en .NET Aspire kunnen samenwerken om uw lokale ontwikkelervaring te verbeteren. Door Dapr te gebruiken met .NET Aspire, kunt u zich richten op het schrijven en implementeren van gedistribueerde .NETtoepassingen in plaats van lokaal onboarden.

In deze handleiding leert u hoe u kunt profiteren van de abstractie van Dapren de opiniërende configuratie van .NET Aspirevan cloudtechnologieën om eenvoudige, draagbare, veerkrachtige en beveiligde microservices op schaal te bouwen.

Vergelijking van .NET Aspire en Dapr

Op het eerste gezicht zien Dapr en .NET Aspire er mogelijk uit alsof ze overlappende functionaliteit hebben en dat wel. Ze hebben echter verschillende benaderingen. .NET .NET Aspire is van mening over het bouwen van gedistribueerde toepassingen op een cloudplatform en is gericht op het verbeteren van de lokale ontwikkelervaring. Dapr is een runtime die de gemeenschappelijke complexiteit van het onderliggende cloudplatform abstraheert tijdens de ontwikkeling en in productie. Het is afhankelijk van sidecars om abstracties te bieden voor zaken als configuratie, geheimbeheer en berichten. De onderliggende technologie kan eenvoudig worden overgeschakeld via configuratiebestanden, terwijl uw code niet hoeft te veranderen.

Aspect .NET Aspire Dapr
Doel Ontworpen om het eenvoudiger te maken om cloudeigen oplossingen te ontwikkelen op lokale ontwikkelcomputers. Ontworpen om het eenvoudiger te maken om gedistribueerde apps te ontwikkelen en uit te voeren met algemene API's die eenvoudig kunnen worden gewisseld.
API's Ontwikkelaars moeten resource-API's aanroepen met behulp van hun specifieke SDK's Ontwikkelaars roepen API's aan in de Dapr sidecar, waarmee de aanroep naar de juiste API wordt doorgestuurd. Het is eenvoudig om resource-API's te wisselen zonder code in uw microservices te wijzigen.
Talen U schrijft microservices in .NET talen, Go, Python, Javascript en andere. U kunt Dapr sidecar-functies aanroepen in elke taal die HTTP/gRPC-interfaces ondersteunt.
Beveiligingsbeleid Bevat geen beveiligingsbeleid, maar kan verbindingen tussen afhankelijke resources veilig configureren. Bevat aanpasbare beveiligingsbeleidsregels die bepalen welke microservices toegang hebben tot andere services of resources.
Implementatie Er zijn implementatiehulpprogramma's voor Azure en Kubernetes. Bevat geen implementatiehulpprogramma's. Apps worden meestal geïmplementeerd met CI/CD-systemen (Continuous Integration/Continuous Development).
Dashboard Biedt een uitgebreid overzicht van de middelen en hun telemetrie en ondersteunt het monitoren van elke door OTEL ondersteunde bron. Beperkt tot alleen Dapr bronnen.

.NET Aspire maakt het instellen en opsporen van fouten in Dapr toepassingen eenvoudiger door een eenvoudige API te bieden voor het configureren van Dapr sidecars en door de sidecars weer te geven als resources in het dashboard.

Dapr onderdelen verkennen met .NET Aspire

Dapr biedt veel ingebouwde onderdelenen wanneer u Dapr gebruikt met .NET Aspire kunt u deze onderdelen eenvoudig verkennen en configureren. Verwar deze onderdelen niet met .NET.NET Aspire integraties. Denk bijvoorbeeld aan het volgende:

Dapr installeren

Voor deze integratie is Dapr versie 1.13 of hoger vereist. Om Daprte installeren, zie voor de installatie van Dapr CLI. Nadat u de Dapr CLI hebt geïnstalleerd, voert u de dapr inituit, zoals beschreven in Initialiseer Dapr in uw lokale omgeving.

Belangrijk

Als u probeert de .NET Aspire oplossing uit te voeren zonder de Dapr CLI, wordt de volgende fout weergegeven:

Unable to locate the Dapr CLI.

Hostingintegratie

Voeg in uw .NET Aspire-oplossing het 📦Aspire.HostingDapr NuGet-pakket toe in het -app-hostproject om Dapr te integreren en toegang te krijgen tot de typen en API's.

dotnet add package Aspire.Hosting.Dapr

Zie dotnet pakket toevoegen of Pakketafhankelijkheden beheren in .NET toepassingenvoor meer informatie.

Dapr sidecar toevoegen aan .NET Aspire resources

Dapr maakt gebruik van het sidecar-patroon. De Dapr sidecar draait naast uw app als een lichtgewicht, draagbare en stateless HTTP-server die luistert naar HTTP-aanvragen aan uw app.

Als u een sidecar wilt toevoegen aan een .NET.NET Aspire-resource, gebruik dan de WithDaprSidecar-methode daarop. De parameter appId is de unieke id voor de Dapr toepassing, maar dit is optioneel. Als u geen appIdopgeeft, wordt in plaats daarvan de naam van de ouderresource gebruikt.

using Aspire.Hosting.Dapr;

var builder = DistributedApplication.CreateBuilder(args);

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

Dapr sidecars configureren

De methode WithDaprSidecar biedt overbelastingen voor het configureren van uw Dapr sidecar-opties, zoals AppId en verschillende poorten. In het volgende voorbeeld is de Dapr sidecar geconfigureerd met specifieke poorten voor GRPC, HTTP, metrische gegevens en een specifieke app-id.

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

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

Voorbeeld van Dapr app-host voltooien

Denk aan het volgende voorbeeld van een .NET.NET Aspire app-hostproject dat alles samenbrengt:

  • Een back-end-API-service die een Dapr sidecar met standaardinstellingen declareert.
  • Een webfrontendproject dat een Dapr sidecar declareert met specifieke opties, zoals expliciete poorten.
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();

Wanneer u de .NET Aspire-oplossing start, toont het dashboard de Dapr sidecar als resource, met de status en logboeken.

.NET Aspire dashboard met Dapr sidecarbronnen

Gebruik Dapr sidecars bij het toepassen van .NET Aspire projecten

Als u Dapr API's van .NET Aspire resources wilt gebruiken, kunt u het NuGet-pakket 📦Dapr/.AspNetCore/ gebruiken. De Dapr SDK biedt een set API's voor interactie met Dapr sidecars.

Notitie

Gebruik de Dapr.AspNetCore-bibliotheek voor de Dapr-integratie met ASP.NET (DI-integratie, registratie van abonnementen, enzovoort). Niet-ASP.NET apps (zoals console-apps) kunnen alleen de 📦Daprgebruiken.Client bellen via de Dapr sidecar.

dotnet add package Dapr.AspNetCore

Dapr-client toevoegen

Nadat de SDK is geïnstalleerd in een ASP.NET Core-project, kan de SDK worden toegevoegd aan de servicebouwer.

builder.Services.AddDaprClient();

Dapr-methoden aanroepen

Een exemplaar van DaprClient kan nu worden geïntegreerd in uw services om te kunnen communiceren met de Dapr-sidecar via de Dapr-SDK.

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 is de methode waarmee een HTTP-aanvraag naar de Dapr sidecar wordt verzonden. Het is een generieke methode die:

  • Een HTTP-woord.
  • De Dapr app-ID van de service die moet worden aangeroepen.
  • De naam van de methode.
  • Een annuleringstoken.

Afhankelijk van het HTTP-werkwoord kan het ook een verzoekbody en headers bevatten. De generieke typeparameter is het type van het antwoordlichaam.

In het volledige Program.cs bestand voor het front-endproject ziet u:

  • De Dapr-client die wordt toegevoegd aan de servicebouwer.
  • De WeatherApiClient-klasse die gebruikmaakt van de Dapr-client om de back-endservice aan te roepen.
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();

In een Blazor-project kunt u de WeatherApiClient-klasse bijvoorbeeld invoegen in een razor-pagina en deze gebruiken om de back-endservice aan te roepen:

@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();
    }
}

Wanneer de Dapr SDK wordt gebruikt, wordt de Dapr sidecar aangeroepen via HTTP. De Dapr sidecar stuurt de aanvraag vervolgens door naar de doelservice. Terwijl de doeldienst wordt uitgevoerd in een afzonderlijk proces dan de sidecar, wordt de integratie die verband houdt met de dienst uitgevoerd in de Dapr sidecar en is verantwoordelijk voor dienstontdekking en het routeren van het verzoek naar de doeldienst.

Volgende stappen