다음을 통해 공유


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를 설치한 후 로컬 환경 초기화에 설명된 실행합니다.

중요하다

Dapr CLI 없이 앱을 실행하려고 하면 다음 오류가 발생합니다.

Unable to locate the Dapr CLI.

시작

시작하려면 Dapr NuGet 패키지를 설치하여 앱 호스트 프로젝트에 호스팅 패키지를 추가해야 합니다.

dotnet add package Aspire.Hosting.Dapr

자세한 내용은 dotnet add package 또는 manage package dependencies in .NET applications.

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입니다.
  • 특정 포트와 옵션을 명시하여 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(DI 통합, 구독 등록 등)와 Dapr 통합하려면 ASP.NET 라이브러리를 사용합니다. 비ASP.NET 앱(예: 콘솔 앱)은 📦Dapr사용할 수 있습니다.ClientDapr 사이드카를 통해 전화를 걸 수 있습니다.

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 동사
  • 호출할 서비스의 Dapr 앱 ID
  • 메서드 이름
  • 취소 토큰

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 구성 요소 살펴보기

많은 기본 제공 구성 요소를 제공하며, 사용하면 이러한 구성 요소를 쉽게 탐색하고 구성할 수 있습니다. 이러한 구성 요소를 .NET.NET Aspire 통합과 혼동하지 마세요. 예를 들어 다음을 고려합니다.

다음 단계

샘플 앱 .NET AspireDapr