.NET Aspire Orleans 통합
Orleans는 .NET.NET Aspire에 대한 기본 지원을 제공합니다. .NET .NET Aspire애플리케이션 모델을 사용하면 앱의 서비스, 데이터베이스 및 기타 리소스 및 인프라와 이러한 리소스가 서로 어떻게 관련되는지 설명할 수 있습니다. Orleans 탄력적으로 확장 가능하고 내결함성이 있는 분산 애플리케이션을 빌드하는 간단한 방법을 제공합니다. .NET Aspire을(를) 사용하여 Orleans에 클러스터 구성원과 스토리지를 제공하는 등 Orleans과 그 종속성을 구성하고 오케스트레이션할 수 있습니다.
Orleans .NET Aspire리소스로 표시됩니다. 다른 통합과 달리 Orleans 통합은 컨테이너를 만들지 않으며 별도의 client 통합 패키지가 필요하지 않습니다. 대신 .NET Aspire 앱 호스트 프로젝트에서 Orleans 구성을 완료합니다.
메모
이 통합에는 Orleans 버전 8.1.0 이상이 필요합니다.
호스팅 통합
Orleans 호스팅 통합은 Orleans 서비스를 OrleansService 형식으로 모델화합니다. 이 형식 및 API에 액세스하려면 앱 호스트 프로젝트에서 📦Aspire.Hosting.Orleans NuGet 패키지를 추가합니다.
dotnet add package Aspire.Hosting.Orleans
자세한 내용은 dotnet add package 또는 응용 프로그램의 패키지 종속성 관리 .NET를 참조하십시오.
Orleans 리소스 추가
앱 호스트 프로젝트에서 AddOrleans를 호출하여 Orleans 서비스 리소스 빌더를 추가하고 반환합니다.
Orleans 리소스에 제공된 이름은 진단용입니다. 대부분의 애플리케이션의 경우 "default"
값으로 충분합니다.
var orleans = builder.AddOrleans("default")
클러스터링 테이블 및 곡물 스토리지에 Azure 스토리지 사용
Orleans 앱에서 기본 구성 요소는 곡식입니다. 곡물은 지속성 상태를 가질 수 있습니다. 곡물의 지속성 상태를 어딘가에 저장해야 합니다. .NET .NET Aspire 애플리케이션에서 Azure Blob Storage 가능한 위치 중 하나입니다.
Orleans 호스트는 데이터베이스에 자신을 등록하고 해당 데이터베이스를 사용하여 서로를 찾고 클러스터를 형성합니다. 데이터베이스 테이블에는 각 서버가 어떤 사일로의 멤버인지가 저장됩니다. 관계형 또는 NoSQL 데이터베이스를 사용하여 이 정보를 저장할 수 있습니다. .NET .NET Aspire 애플리케이션에서 이 테이블을 저장하는 데 널리 사용되는 선택은 Azure Table Storage.
Azure에서 클러스터링과 곡물 저장소를 이용하여 Orleans을 구성하려면, 앱 호스트 프로젝트에 📦Aspire.Hosting.Azure.Storage NuGet 패키지를 설치합니다.
dotnet add package Aspire.Hosting.Azure.Storage
앱 호스트 프로젝트에서 AddOrleans을 호출한 후, WithClustering 및 WithGrainStorage 메서드를 각각 사용하여 클러스터링과 그레인 저장소를 통해 Orleans 리소스를 구성합니다.
// Add the resources which you will use for Orleans clustering and
// grain state storage.
var storage = builder.AddAzureStorage("storage").RunAsEmulator();
var clusteringTable = storage.AddTables("clustering");
var grainStorage = storage.AddBlobs("grain-state");
// Add the Orleans resource to the Aspire DistributedApplication
// builder, then configure it with Azure Table Storage for clustering
// and Azure Blob Storage for grain storage.
var orleans = builder.AddOrleans("default")
.WithClustering(clusteringTable)
.WithGrainStorage("Default", grainStorage);
앞의 코드는 Orleans 참조하는 모든 서비스가 clusteringTable
리소스도 참조해야 임을 알려줍니다.
앱 호스트에서 Orleansserver 프로젝트 추가
이제 .NET Aspire 오케스트레이션에 등록된 새 프로젝트를 Orleansserver으로 솔루션에 추가할 수 있습니다.
Orleans 클러스터에 구성 곡물을 포함하는 사일로 역할을 하여 참가할 것입니다.
WithReference(orleans)
를 사용하여 server 프로젝트에서 Orleans 리소스를 참조하세요. 서비스에서 Orleans 리소스를 참조하는 경우 해당 리소스도 참조됩니다.
// Add your server project and reference your 'orleans' resource from it.
// It can join the Orleans cluster as a silo.
// This implicitly adds references to the required resources.
// In this case, that is the 'clusteringTable' resource declared earlier.
builder.AddProject<Projects.OrleansServer>("silo")
.WithReference(orleans)
.WithReplicas(3);
앱 호스트에서 Orleansclient 프로젝트 추가
Orleans 클라이언트는 Orleans 서버에서 호스팅되는 곡물과 통신합니다. 예를 들어 .NET Aspire 앱에는 Orleans 클러스터에서 곡물을 호출하는 프런트 엔드 웹 사이트가 있을 수 있습니다. 당신의 Orleansclient에서 WithReference(orleans.AsClient())
을(를) 사용하여 Orleans 리소스를 참조합니다.
// Reference the Orleans resource as a client from the 'frontend'
// project so that it can connect to the Orleans cluster.
builder.AddProject<Projects.OrleansClient>("frontend")
.WithReference(orleans.AsClient())
.WithExternalHttpEndpoints()
.WithReplicas(3);
Orleans server 프로젝트 만들기
이제 앱 호스트 프로젝트가 완료되었으므로 Orleansserver 프로젝트를 구현할 수 있습니다. 먼저 필요한 NuGet 패키지를 추가해 보겠습니다.
Orleans server 프로젝트의 폴더에서 다음 명령을 실행합니다.
dotnet add package Aspire.Azure.Data.Tables
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Microsoft.Orleans.Persistence.AzureStorage
dotnet add package Microsoft.Orleans.Clustering.AzureStorage
다음으로, Orleansserver 프로젝트의 Program.cs 파일에서 Azure Storage Blob 및 테이블 클라이언트를 추가한 다음, UseOrleans호출합니다.
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.AddKeyedAzureBlobClient("grain-state");
builder.UseOrleans();
다음 코드는 CounterGrain
이라는 곡물을 포함하여 Orleansserver 프로젝트의 전체 예제입니다.
using Orleans.Runtime;
using OrleansContracts;
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.AddKeyedAzureBlobClient("grain-state");
builder.UseOrleans();
var app = builder.Build();
app.MapGet("/", () => "OK");
await app.RunAsync();
public sealed class CounterGrain(
[PersistentState("count")] IPersistentState<int> count) : ICounterGrain
{
public ValueTask<int> Get()
{
return ValueTask.FromResult(count.State);
}
public async ValueTask<int> Increment()
{
var result = ++count.State;
await count.WriteStateAsync();
return result;
}
}
Orleans client 프로젝트 만들기
Orleans client 프로젝트에서 동일한 NuGet 패키지를 추가합니다.
dotnet add package Aspire.Azure.Data.Tables
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Microsoft.Orleans.Persistence.AzureStorage
dotnet add package Microsoft.Orleans.Clustering.AzureStorage
그런 다음, Orleansclient 프로젝트의 Program.cs 파일에서 Azure 테이블 스토리지 client를 추가하고, UseOrleansClient를 호출합니다.
builder.AddKeyedAzureTableClient("clustering");
builder.UseOrleansClient();
다음 코드는 Orleansclient 프로젝트의 전체 예제입니다. 위의 Orleansserver 예제에 정의된 CounterGrain
곡물을 호출합니다.
using OrleansContracts;
var builder = WebApplication.CreateBuilder(args);
builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.UseOrleansClient();
var app = builder.Build();
app.MapGet("/counter/{grainId}", async (IClusterClient client, string grainId) =>
{
var grain = client.GetGrain<ICounterGrain>(grainId);
return await grain.Get();
});
app.MapPost("/counter/{grainId}", async (IClusterClient client, string grainId) =>
{
var grain = client.GetGrain<ICounterGrain>(grainId);
return await grain.Increment();
});
app.UseFileServer();
await app.RunAsync();
OpenTelemetry 활성화
규칙에 따라 .NET.NET Aspire 솔루션에는 서비스에 대한 기본 구성 및 동작을 정의하는 프로젝트가 포함됩니다. 이 프로젝트는 서비스 기본값 프로젝트라고 불리며, 템플릿은 ServiceDefaults로 끝나는 이름으로 생성됩니다. Orleans을 .NET Aspire의 OpenTelemetry에 구성하려면 Orleans 모니터링 가이드에 따라 서비스 기본 설정 프로젝트에 구성을 적용하십시오.
ConfigureOpenTelemetry
메서드를 수정하여 Orleans미터 및 추적 계측기를 추가하세요. 다음 코드 조각은 서비스 기본 프로젝트에서 수정된 Extensions.cs 파일을 보여주며, 여기에는 Orleans메트릭 및 추적이 포함되어 있습니다.
public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
{
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithMetrics(metrics =>
{
metrics.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation()
.AddRuntimeInstrumentation()
.AddMeter("Microsoft.Orleans");
})
.WithTracing(tracing =>
{
tracing.AddSource("Microsoft.Orleans.Runtime");
tracing.AddSource("Microsoft.Orleans.Application");
tracing.AddAspNetCoreInstrumentation()
.AddHttpClientInstrumentation();
});
builder.AddOpenTelemetryExporters();
return builder;
}
지원되는 공급자
Orleans Aspire 통합은 현재 Orleans 공급자의 제한된 하위 집합을 지원합니다.
- 클러스터링:
- Redis
- Azure 스토리지 테이블
- 고집:
- Redis
- Azure 스토리지 테이블
- Azure 스토리지 블롭
- 미리 알림:
- Redis
- Azure 스토리지 테이블
- 곡물 목록:
- Redis
- Azure 스토리지 테이블
스트리밍 공급자는 Orleans 버전 8.1.0을 기준으로 지원되지 않습니다.
다음 단계
.NET Aspire