다음을 통해 공유


.NET Aspire Dapr 통합

분산 애플리케이션 런타임(Dapr) 다른 서비스 및 종속성과 상호 작용하고 해당 서비스 및 종속성의 세부 사항에서 애플리케이션을 추상화하기 위한 통로 역할을 하는 개발자 API를 제공합니다. Dapr 및 .NET Aspire 함께 작동하여 로컬 개발 환경을 개선할 수 있습니다. .NET Aspire Dapr 사용하면 로컬 온보딩 대신 .NET기반 분산 애플리케이션을 작성하고 구현하는 데 집중할 수 있습니다.

이 가이드에서는 클라우드 기술의 Dapr추상화 및 .NET Aspire구성을 활용하여 간단하고 이식 가능하며 복원력 있고 보호된 마이크로 서비스를 대규모로 빌드하는 방법을 알아봅니다.

.NET Aspire 및 Dapr 비교

처음에는 Dapr와 .NET Aspire이 기능이 겹치는 것처럼 보일 수 있습니다. 그러나 다른 접근 방식을 취합니다. .NET .NET Aspire 클라우드 플랫폼에서 분산 애플리케이션을 빌드하는 방법에 대해 의견을 제시하고 로컬 개발 환경을 개선하는 데 중점을 둡니다. Dapr 개발 중과 프로덕션 환경에서 기본 클라우드 플랫폼의 일반적인 복잡성을 추상화하는 런타임입니다. 사이드카를 사용하여 구성, 비밀 관리 및 메시징과 같은 추상화 작업을 제공합니다. 기본 기술은 구성 파일을 통해 쉽게 전환할 수 있지만 코드는 변경할 필요가 없습니다.

양상 .NET Aspire Dapr
목적 로컬 개발 컴퓨터에서 클라우드 네이티브 솔루션을 더 쉽게 개발할 수 있도록 설계되었습니다. 쉽게 교환할 수 있는 공통 API를 사용하여 분산 앱을 더 쉽게 개발하고 실행할 수 있도록 설계되었습니다.
API들 개발자는 특정 SDK를 사용하여 리소스 API를 호출해야 합니다. 개발자는 Dapr 사이드카에서 API를 호출하여 호출을 올바른 API로 전달합니다. 마이크로 서비스에서 코드를 변경하지 않고 리소스 API를 쉽게 교환할 수 있습니다.
언어들 .NET 언어, Go, Python, Javascript 등으로 마이크로 서비스를 작성합니다. HTTP/gRPC 인터페이스를 지원하는 모든 언어로 Dapr 사이드카 함수를 호출할 수 있습니다.
보안 정책 보안 정책은 포함하지 않지만 종속 리소스 간 연결을 안전하게 구성할 수 있습니다. 다른 서비스 또는 리소스에 액세스할 수 있는 마이크로 서비스를 제어하는 사용자 지정 가능한 보안 정책을 포함합니다.
배치 Azure 및 Kubernetes위한 배포 도구가 있습니다. 배포 도구는 포함하지 않습니다. 앱은 일반적으로 CI/CD(지속적인 통합/지속적인 개발) 시스템을 사용하여 배포됩니다.
대시보드 리소스와 그에 따른 원격 분석에 대한 포괄적인 보기를 제공하며, OTEL이 지원하는 리소스에서 수신 대기를 지원합니다. Dapr 리소스로만 제한됩니다.

.NET Aspire Dapr 사이드카를 구성하는 간단한 API를 제공하고 사이드카를 대시보드에 리소스로 노출하여 Dapr 애플리케이션을 더 쉽게 설정하고 디버깅할 수 있습니다.

Dapr 사용하여 .NET Aspire 구성 요소 살펴보기

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

설치 Dapr

이 통합에는 Dapr 버전 1.13 이상이 필요합니다. Dapr설치하려면 Dapr CLI설치를 참조하세요. Dapr CLI를 설치한 후 로컬 환경Dapr 초기화에 설명된 대로 dapr init실행합니다.

중요하다

Dapr CLI 없이 .NET Aspire 솔루션을 실행하려고 하면 다음 오류가 표시됩니다.

Unable to locate the Dapr CLI.

호스팅 통합

.NET Aspire 솔루션에서 Dapr을 통합하고 해당 형식 및 API에 액세스하려면 앱 호스트 프로젝트에 📦Aspire호스팅Dapr NuGet 패키지를 추가하세요.

dotnet add package Aspire.Hosting.Dapr

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

.NET Aspire 리소스에 Dapr 사이드카 추가

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 메서드는 다양한 포트 및 AppId와 같은 Dapr 사이드카 옵션을 구성하기 위한 오버로드를 제공합니다. 다음 예제에서 Dapr 사이드카는 GRPC, HTTP, 메트릭 및 특정 앱 ID에 대한 특정 포트로 구성됩니다.

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 앱 호스트 프로젝트의 예제를 살펴보겠습니다.

  • 기본값을 갖는 Dapr 사이드카를 선언하는 백엔드 API 서비스입니다.
  • 특정 옵션으로 명시적 포트를 설정하여 Dapr 사이드카를 선언하는 웹 프론트엔드 프로젝트입니다.
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 사이드카를 리소스로 표시합니다.

.NET Aspire 대시보드에서 Dapr 사이드카 리소스 보여 주기

.NET Aspire 프로젝트를 사용할 때 Dapr 사이드카 사용

.NET Aspire 리소스에서 Dapr API를 사용하려면 📦Dapr사용할 수 있습니다. AspNetCore/ NuGet 패키지입니다. Dapr SDK는 Dapr 사이드카와 상호 작용하는 API 집합을 제공합니다.

메모

Dapr.AspNetCore(DI 통합, 구독 등록 등)와 Dapr 통합하려면 ASP.NET 라이브러리를 사용합니다. 비ASP.NET 앱(예: 콘솔 앱)은 📦Dapr사용할 수 있습니다.ClientDapr 사이드카를 통해 전화를 걸 수 있습니다.

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 Dapr 사이드카에 HTTP 요청을 보내는 방법입니다. 다음을 수행하는 제네릭 메서드입니다.

  • HTTP 동사입니다.
  • 호출할 서비스의 Dapr 앱 ID입니다.
  • 메서드 이름입니다.
  • 취소 토큰입니다.

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를 사용하면 Dapr 사이드카가 HTTP를 통해 호출됩니다. 그런 다음 Dapr 사이드카가 대상 서비스에 요청을 전달합니다. 대상 서비스는 사이드카와 별도의 프로세스에서 실행되는 동안 서비스와 관련된 통합은 Dapr 사이드카에서 실행되며 서비스 검색 및 대상 서비스로의 라우팅을 담당합니다.

다음 단계