빠른 시작: 첫 번째 .NET.NET Aspire 솔루션 빌드
클라우드 네이티브 앱은 데이터베이스, 스토리지 및 캐싱 솔루션, 메시징 공급자 또는 기타 웹 서비스와 같은 다양한 서비스에 대한 연결이 필요한 경우가 많습니다. .NET .NET Aspire 이러한 유형의 서비스 간의 연결 및 구성을 간소화하도록 설계되었습니다. 빠른 시작 가이드에서는 .NET.NET Aspire 스타터 애플리케이션 템플릿 솔루션을 만드는 방법을 보여줍니다.
이 빠른 시작에서는 다음 작업을 탐색합니다.
- 기본 .NET 앱을 만들고, .NET Aspire을 사용하도록 설정합니다.
- 프로젝트를 만들 때 캐싱을 구현하도록 .NET.NET Aspire 통합을 추가하고 구성합니다.
- API를 작성하고 서비스 탐색을 사용하여 연결합니다.
- 프런트 엔드 UI, 백 엔드 API 및 로컬 Redis 캐시 간의 통신을 오케스트레이션합니다.
필수 구성 요소
.NET .NET Aspire작업하려면 다음을 로컬에 설치해야 합니다.
- .NET 8.0 또는 .NET 9.0
- OCI 규격 컨테이너 런타임(예:
- Docker 데스크톱 또는 Podman. 자세한 내용은 컨테이너 런타임참조하세요.
- IDE(통합 개발자 환경) 또는 코드 편집기(예:
- Visual Studio 2022 버전 17.9 이상(선택 사항)
-
Visual Studio Code(선택 사항)
- C# Dev Kit: 확장(선택 사항)
- JetBrains Rider 플러그인 .NET.NET Aspire(선택 사항)
자세한 내용은 .NET.NET Aspire 설정 및 도구및 .NET.NET Aspire SDK참조하세요.
.NET .NET Aspire 템플릿 만들기
새 .NET Aspire 시작 애플리케이션을 만들려면 Visual Studio, Visual Studio Code또는 .NET CLI를 사용할 수 있습니다.
Visual Studio 몇 가지 초기 설정 구성을 처리하는 .NET Aspire 템플릿을 제공합니다. 다음 단계를 완료하여 이 빠른 시작을 위한 프로젝트를 만듭니다.
Visual Studio맨 위에서 파일>새>프로젝트이동합니다.
대화 상자 창에서 Aspire 검색하고 .NET.NET Aspire 시작 앱선택합니다. 다음선택합니다.
새 프로젝트를 구성하는 화면에서:
- 프로젝트 이름AspireSample입력하세요.
- 값의
기본값으로 두고다음을 선택합니다.
추가 정보 화면에서 다음을 수행하십시오.
- .NET 9.0(표준 용어 지원) 선택되어 있는지 확인합니다.
- 사용을 확인하시고(지원되는 컨테이너 런타임 필수) Redis 캐싱에 체크한 후, 생성를 선택합니다.
- 필요에 따라 테스트 프로젝트만들기
선택할 수 있습니다. 자세한 내용은 첫 번째 .NET.NET Aspire 테스트작성을 참조하세요.
Visual Studio은 .NET Aspire을 사용하도록 설계된 새로운 솔루션을 만듭니다.
Visual Studio Code 몇 가지 초기 설정 구성을 처리하는 .NET Aspire 프로젝트 템플릿을 제공합니다. 다음 단계를 완료하여 이 빠른 시작을 위한 프로젝트를 만듭니다.
dotnet new install Aspire.ProjectTemplates
이전 .NET CLI 명령을 사용하면 .NET Aspire 템플릿을 사용할 수 있습니다. 템플릿에서 .NET.NET Aspire Starter 앱을 만들려면 다음 dotnet new
명령을 실행합니다.
dotnet new aspire-starter --use-redis-cache --output AspireSample
자세한 내용은 dotnet 새참조하세요. .NET CLI는 .NET Aspire사용하도록 구조화된 새 솔루션을 만듭니다.
사용 가능한 템플릿에 대한 자세한 내용은
로컬로 앱 테스트
샘플 앱에는 최소 API 프로젝트와 통신하는 프런트 엔드 Blazor 앱이 포함되어 있습니다. API 프로젝트는 프런트 엔드에 가짜 날씨 데이터를 제공하는 데 사용됩니다. 프런트 엔드 앱은 서비스 검색을 사용하여 API 프로젝트에 연결하도록 구성됩니다. API 프로젝트는 Redis출력 캐싱을 사용하도록 구성됩니다. 이제 샘플 앱이 테스트할 준비가 되었습니다. 다음 조건을 확인하려고 합니다.
- 날씨 데이터는 서비스 검색을 사용하여 API 프로젝트에서 검색되고 날씨 페이지에 표시됩니다.
- 후속 요청은 .NET AspireRedis 통합에 의해 구성된 출력 캐싱을 통해 처리됩니다.
Visual Studio, 솔루션 탐색기에서 AspireSample.AppHost 프로젝트를 마우스 오른쪽 버튼으로 클릭한 후, 시작 프로젝트로 설정을 선택하여 해당 프로젝트를 시작 프로젝트로 설정합니다. 이미 시작 프로젝트로 자동으로 설정되었을 수 있습니다. 설정되면 F5 누르거나(Ctrl + F5 디버깅하지 않고 실행) 앱을 실행합니다.
앱을 실행하기 전에 ASP.NET Corelocalhost 인증서를 신뢰해야 합니다. 다음 명령을 실행합니다.
dotnet dev-certs https --trust
자세한 내용은 .NET Aspire신뢰할 수 없는 localhost 인증서 문제 해결을 참조하세요. Linux localhost 인증서 문제 해결에 대한 자세한 내용은 ASP.NET Core: GitHub 리포지토리 문제 #32842참조하세요.
Visual Studio Code에서 F5를 눌러 앱을 실행합니다. 어떤 언어를 선택하라는 메시지가 표시되고 C#이 제안됩니다. C#을 선택한 다음 기본 구성이 포함된 AspireSample.AppHost 프로젝트를 선택합니다.
.NET Aspire처음 실행하거나 새 .NET 설치가 있는 새 컴퓨터인 경우 자체 서명된 localhost 인증서를 설치하라는 메시지가 표시되고 프로젝트가 시작되지 않습니다.
예선택하면 자체 서명된 인증서가성공적으로 생성되었음을 나타내는 정보 메시지가 표시됩니다.
여전히 문제가 있는 경우 모든 브라우저 창을 닫고 다시 시도하세요. 자세한 내용은 .NET Aspire신뢰할 수 없는 localhost 인증서 문제 해결을 참조하세요.
팁
MacOS에서 Safari를 사용하는 경우 브라우저가 열렸을 때 페이지가 비어 있다면 수동으로 페이지를 새로 고쳐야 할 수 있습니다.
앱은 브라우저에 .NET.NET Aspire 대시보드를 표시합니다. 나중에 대시보드를 자세히 살펴봅다. 지금은 리소스 목록에서 webfrontend 프로젝트를 찾고 프로젝트의 localhost 엔드포인트를 선택합니다.
웹 프론트엔드 앱의 홈 페이지에는 "Hello, world!"
홈페이지에서 왼쪽 탐색을 사용하여 날씨 페이지로 이동합니다. 날씨 페이지에는 날씨 데이터가 표시됩니다. 예측 테이블에 표시되는 값 중 일부를 주의 하여 기록해 둡다.
페이지를 10초 동안 계속 새로 고칩니다. 10초 이내에 캐시된 데이터가 반환됩니다. 결국 데이터가 임의로 생성되고 캐시가 업데이트되므로 다른 날씨 데이터 집합이 나타납니다.
🤓 축하합니다! 첫 번째 .NET.NET Aspire 솔루션을 만들고 실행했습니다. 앱을 중지하려면 브라우저 창을 닫습니다.
Visual Studio앱을 중지하려면 디버그 메뉴에서 디버깅 중지 선택합니다.
앱을 중지하려면 터미널 창에서 Ctrl + C 누릅니다.
다음으로, 새 .NET.NET Aspire 솔루션의 구조 및 기타 기능을 조사합니다.
.NET .NET Aspire 대시보드 살펴보기
.NET .NET Aspire 프로젝트를 실행하면 앱의 다양한 부분을 모니터링하는 데 사용하는 대시보드 시작됩니다. 대시보드는 다음 스크린샷과 유사합니다.
왼쪽 탐색을 사용하여 각 페이지를 방문하여 .NET.NET Aspire 리소스에 대한 다양한 정보를 확인합니다.
리소스: 앱 상태, 엔드포인트 주소 및 로드된 환경 변수와 같은 .NET Aspire 프로젝트의 모든 개별 .NET 프로젝트에 대한 기본 정보를 나열합니다.
콘솔: 앱의 각 프로젝트의 콘솔 출력을 표시합니다.
구조적: 구조화된 로그를 테이블 형식으로 표시합니다. 이러한 로그는 기본 필터링, 자유 형식 검색 및 로그 수준 필터링도 지원합니다.
apiservice
및webfrontend
로그를 보실 수 있을 것입니다. 행의 오른쪽 끝에 있는 보기 단추를 선택하여 각 로그 항목의 세부 정보를 확장할 수 있습니다.추적: 응용 프로그램을 통해 요청 경로를 추적할 수 있는 애플리케이션에 대한 추적을 표시합니다. /weather 에 대한 요청을 찾아보시고, 페이지 오른쪽에서 보기 를 선택하세요. 대시보드는 앱의 여러 부분을 통해 이동할 때 요청의 진행 단계를 표시해야 합니다.
메트릭: 노출되는 다양한 계측 및 미터와 앱의 해당 차원을 표시합니다. 메트릭은 사용 가능한 차원에 따라 필터를 조건부로 노출합니다.
자세한 내용은 대시보드 개요
.NET .NET Aspire 솔루션 구조 이해
솔루션은 다음 프로젝트로 구성됩니다.
- AspireSample.ApiService: ASP.NET Core 최소 API 프로젝트는 프런트 엔드에 데이터를 제공하는 데 사용됩니다. 이 프로젝트는 공유된 AspireSample.ServiceDefaults 프로젝트에 의존합니다.
- AspireSample.AppHost: 앱의 다양한 프로젝트와 서비스를 연결하고 구성하도록 설계된 오케스트레이터 프로젝트입니다. 오케스트레이터는 시작 프로젝트로 설정되어야 하며, AspireSample.ApiService 및 AspireSample.Web 프로젝트에 의존합니다.
- AspireSample.ServiceDefaults: .NET.NET Aspire 솔루션 내의 프로젝트들에서 복원력, 서비스 발견, 원격 분석과 같은 주제와 관련된 재사용 구성을 관리하는 공유 프로젝트입니다.
- AspireSample.Web: 기본 .NET Aspire 서비스 구성을 사용하는 ASP.NET CoreBlazor 앱 프로젝트인 이 프로젝트는 AspireSample.ServiceDefaults 프로젝트에 따라 달라집니다. 자세한 내용은 .NET.NET Aspire 서비스 기본값참조하세요.
AspireSample 디렉터리가 다음 구조와 유사해야 합니다.
└───📂 AspireSample
├───📂 AspireSample.ApiService
│ ├───📂 Properties
│ │ └─── launchSettings.json
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.ApiService.csproj
│ └─── Program.cs
├───📂 AspireSample.AppHost
│ ├───📂 Properties
│ │ └─── launchSettings.json
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.AppHost.csproj
│ └─── Program.cs
├───📂 AspireSample.ServiceDefaults
│ ├─── AspireSample.ServiceDefaults.csproj
│ └─── Extensions.cs
├───📂 AspireSample.Web
│ ├───📂 Components
│ │ ├───📂 Layout
│ │ │ ├─── MainLayout.razor
│ │ │ ├─── MainLayout.razor.css
│ │ │ ├─── NavMenu.razor
│ │ │ └─── NavMenu.razor.css
│ │ ├───📂 Pages
│ │ │ ├─── Counter.razor
│ │ │ ├─── Error.razor
│ │ │ ├─── Home.razor
│ │ │ └─── Weather.razor
│ │ ├─── _Imports.razor
│ │ ├─── App.razor
│ │ └─── Routes.razor
│ ├───📂 Properties
│ │ └─── launchSettings.json
│ ├───📂 wwwroot
│ │ ├───📂 bootstrap
│ │ │ ├─── bootstrap.min.css
│ │ │ └─── bootstrap.min.css.map
│ │ ├─── app.css
│ │ └─── favicon.png
│ ├─── appsettings.Development.json
│ ├─── appsettings.json
│ ├─── AspireSample.Web.csproj
│ ├─── Program.cs
│ └─── WeatherApiClient.cs
└─── AspireSample.sln
시작 프로젝트 살펴보기
.NET .NET Aspire 솔루션의 각 프로젝트는 앱 구성에서 역할을 합니다. *.웹 프로젝트는 프론트엔드 UI를 제공하는 표준 ASP.NET CoreBlazor 앱입니다. 자세한 내용은 ASP.NET Core 9.0의 새로운 기능: Blazor을 참조하세요. *.ApiService 프로젝트는 표준 ASP.NET Core Minimal API 템플릿 프로젝트입니다. 이 두 프로젝트는 모두 *에 따라 달라집니다. ServiceDefaults 프로젝트는 솔루션의 프로젝트에서 다시 사용되는 구성을 관리하는 데 사용되는 공유 프로젝트입니다.
이 퀵스타트에서 관심 있는 두 프로젝트는 다음 섹션에 자세히 설명된 *.AppHost 및 *.ServiceDefaults 프로젝트입니다.
호스트 프로젝트 .NET.NET Aspire
*.AppHost 프로젝트는 오케스트레이터 역할을 하며, 프로젝트 파일의 IsAspireHost
속성을 true
으로 설정합니다.
<Project Sdk="Microsoft.NET.Sdk">
<Sdk Name="Aspire.AppHost.Sdk" Version="9.0.0" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireHost>true</IsAspireHost>
<UserSecretsId>2aa31fdb-0078-4b71-b953-d23432af8a36</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\AspireSample.ApiService\AspireSample.ApiService.csproj" />
<ProjectReference Include="..\AspireSample.Web\AspireSample.Web.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Aspire.Hosting.AppHost" Version="9.0.0" />
<PackageReference Include="Aspire.Hosting.Redis" Version="9.0.0" />
</ItemGroup>
</Project>
자세한 내용은 .NET.NET Aspire 오케스트레이션 개요 및 .NET.NET Aspire SDK참조하세요.
AspireSample.AppHost 프로젝트의 Program.cs 파일을 고려합니다.
var builder = DistributedApplication.CreateBuilder(args);
var cache = builder.AddRedis("cache");
var apiService = builder.AddProject<Projects.AspireSample_ApiService>("apiservice");
builder.AddProject<Projects.AspireSample_Web>("webfrontend")
.WithExternalHttpEndpoints()
.WithReference(cache)
.WaitFor(cache)
.WithReference(apiService)
.WaitFor(apiService);
builder.Build().Run();
이전에 .NET 제네릭 호스트 또는 ASP.NET Core 웹 호스트 사용한 경우 앱 호스트 프로그래밍 모델 및 작성기 패턴을 잘 알고 있어야 합니다. 앞의 코드는 다음과 같습니다.
- DistributedApplication.CreateBuilder()호출하여 IDistributedApplicationBuilder 인스턴스를 만듭니다.
-
AddRedis을(를) 이름
"cache"
로 호출하여 앱에 Redisserver을(를) 추가하고, 반환된 값을IResourceBuilder<RedisResource>
형식인cache
변수에 할당합니다. - 프로젝트의 세부 정보가 포함된 제네릭 형식 매개 변수가 지정된 경우 AddProject 호출하여 애플리케이션 모델에
AspireSample.ApiService
프로젝트를 추가합니다. 이는 .NET.NET Aspire기본 구성 요소 중 하나이며 앱의 프로젝트 간에 서비스 검색 및 통신을 구성하는 데 사용됩니다."apiservice"
이름 인수는 애플리케이션 모델에서 프로젝트를 식별하는 데 사용되며 나중에 프로젝트와 통신하려는 프로젝트에서 사용됩니다. - 이번에는 애플리케이션 모델에
AspireSample.Web
프로젝트를 추가하여AddProject
다시 호출합니다.cache
및apiService
변수를 전달하는 여러 개의 WithReference 호출을 연결합니다.WithReference
API는 애플리케이션 모델에 추가되는 프로젝트에 서비스 검색 정보 또는 연결 문자열 구성을 삽입하는 .NET.NET Aspire또 다른 기본 API입니다. 또한WaitFor
API에 대한 호출은AspireSample.Web
프로젝트를 시작하기 전에cache
및apiService
리소스를 사용할 수 있도록 하는 데 사용됩니다. 자세한 내용은 .NET.NET Aspire 오케스트레이션: 리소스를 기다리는 중을 참조하세요.
마지막으로 앱이 빌드되고 실행됩니다. DistributedApplication.Run() 메서드는 앱 및 모든 종속성을 시작합니다. 자세한 내용은 .NET.NET Aspire 오케스트레이션 개요참조하세요.
팁
AddRedis 호출은 앱에서 사용할 로컬 Redis 컨테이너를 만듭니다. 단순히 기존 Redis 인스턴스를 가리키려는 경우 AddConnectionString
메서드를 사용하여 기존 연결 문자열을 참조할 수 있습니다. 자세한 내용은 기존 리소스를 참조하세요 .
.NET .NET Aspire 서비스 기본값 프로젝트
*.ServiceDefaults 프로젝트는 솔루션 내의 여러 프로젝트에서 재사용되는 구성을 관리하는 데 사용되는 공유 프로젝트입니다. 이 프로젝트는 모든 종속 서비스가 동일한 복원력, 서비스 검색 및 OpenTelemetry 구성을 공유하도록 합니다. 공유 .NET.NET Aspire 프로젝트 파일은 IsAspireSharedProject
속성이 true
으로 설정되어 포함됩니다.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsAspireSharedProject>true</IsAspireSharedProject>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.Extensions.Http.Resilience" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.ServiceDiscovery" Version="9.0.0" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.10.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.10.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.10.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Runtime" Version="1.10.0" />
</ItemGroup>
</Project>
서비스 기본값 프로젝트는 AddServiceDefaults
IHostApplicationBuilder 형식에 확장 메서드를 노출합니다. 템플릿의 서비스 기본 프로젝트 시작 지점이며 필요에 맞게 사용자 지정할 수 있습니다. 자세한 내용은 .NET.NET Aspire 서비스 기본값참조하세요.
서비스 통신 조율
.NET
.NET Aspire 앱의 서로 다른 부분 간의 연결 및 통신을 구성하는 데 도움이 되도록 오케스트레이션 기능을 제공합니다.
AspireSample.AppHost 프로젝트는 AspireSample.ApiService 및 AspireSample.Web 프로젝트를 애플리케이션 모델에 추가했습니다. 또한 Blazor 프런트 엔드를 위한 이름으로 "webfrontend"
을, API 프로젝트 참조를 위한 이름으로 "apiservice"
를 선언했습니다. 또한 "cache"
레이블이 지정된 Redisserver 리소스가 추가되었습니다. 이러한 이름은 앱의 프로젝트 간에 서비스 검색 및 통신을 구성하는 데 사용됩니다.
프런트 엔드 앱은 API 프로젝트와 통신하는 데 사용되는 형식화된 HttpClient 정의합니다.
namespace AspireSample.Web;
public class WeatherApiClient(HttpClient httpClient)
{
public async Task<WeatherForecast[]> GetWeatherAsync(
int maxItems = 10,
CancellationToken cancellationToken = default)
{
List<WeatherForecast>? forecasts = null;
await foreach (var forecast in
httpClient.GetFromJsonAsAsyncEnumerable<WeatherForecast>(
"/weatherforecast", cancellationToken))
{
if (forecasts?.Count >= maxItems)
{
break;
}
if (forecast is not null)
{
forecasts ??= [];
forecasts.Add(forecast);
}
}
return forecasts?.ToArray() ?? [];
}
}
public record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
HttpClient
서비스 검색을 사용하도록 구성됩니다.
AspireSample.Web 프로젝트의 Program.cs 파일에서 다음 코드를 고려합니다.
using AspireSample.Web;
using AspireSample.Web.Components;
var builder = WebApplication.CreateBuilder(args);
// Add service defaults & Aspire client integrations.
builder.AddServiceDefaults();
builder.AddRedisOutputCache("cache");
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddHttpClient<WeatherApiClient>(client =>
{
// This URL uses "https+http://" to indicate HTTPS is preferred over HTTP.
// Learn more about service discovery scheme resolution at https://aka.ms/dotnet/sdschemes.
client.BaseAddress = new("https+http://apiservice");
});
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseAntiforgery();
app.UseOutputCache();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapDefaultEndpoints();
app.Run();
앞의 코드는 다음과 같습니다.
-
AddServiceDefaults
호출하여 앱에 대한 공유 기본값을 구성합니다. - 애플리케이션 모델에 Redis 컨테이너
"cache"
를 추가할 때 사용했던 것과 동일한connectionName
로 AddRedisOutputCache를 호출합니다. 그러면 출력 캐싱에 Redis 사용하도록 앱이 구성됩니다. -
AddHttpClient을 호출한 후, HttpClient.BaseAddress을
"https+http://apiservice"
로 설정합니다. 애플리케이션 모델에 API 프로젝트를 추가할 때 사용된 이름이며 서비스 검색이 구성된 경우 API 프로젝트에 대한 올바른 주소로 자동으로 확인됩니다.
자세한 내용은 HttpClient
클래스를 사용하여 HTTP 요청 만들기를 참조하세요.
참조
- .NET .NET Aspire 통합 개요
서비스 검색 - .NET .NET Aspire 서비스의 기본값은
- .NET .NET Aspire 상태 검사
- .NET .NET Aspire 원격 분석
- .NET Aspire 신뢰할 수 없는 localhost 인증서 문제 해결
다음 단계
.NET Aspire