다음을 통해 공유


Orleans와 .NET Aspire 사용

Orleans는 .NET Aspire에 대한 내장 지원을 제공합니다. .NET .NET Aspire애플리케이션 모델을 사용하면 앱의 서비스, 데이터베이스 및 기타 리소스/인프라와 관련 방법을 설명할 수 있습니다. Orleans 탄력적으로 확장 가능하고 내결함성이 있는 분산 애플리케이션을 빌드하는 간단한 방법을 제공합니다. .NET Aspire는 Orleans 및 그 종속성을 구성하고 오케스트레이션하는 데 사용되며, 이 과정에서 Orleans에 데이터베이스 클러스터 멤버 자격과 스토리지를 제공합니다.

Orleans .NET Aspire리소스로 표시됩니다. Orleans 리소스에는 클러스터 멤버십 공급자 및 스토리지 공급자와 같이 서비스 운영에 필요한 구성이 포함됩니다.

필수 구성 요소

.NET .NET Aspire작업하려면 다음을 로컬에 설치해야 합니다.

자세한 내용은 .NET.NET Aspire 설정 및 도구.NET.NET Aspire SDK참조하세요.

.NET .NET Aspire필수 조건 외에도 다음이 필요합니다.

  • Orleans 버전 8.1.0 이상

자세한 내용은 .NET.NET Aspire 설정 및 도구참조하세요.

시작

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

dotnet add package Aspire.Hosting.Orleans

자세한 내용은 dotnet add package 또는 응용 프로그램의 패키지 종속성 관리 .NET를 참조하십시오.

Orleans 리소스는 .NET Aspire 메서드를 사용하여 AddOrleans(string name) 분산 애플리케이션 작성기에 추가되며, 이 메서드는 Orleans 리소스 작성기를 반환합니다. Orleans 리소스에 제공된 이름은 진단용입니다. 대부분의 애플리케이션의 경우 "default" 값으로 충분합니다.

var orleans = builder.AddOrleans("default")

Orleans 리소스 작성기에서는 Orleans 리소스를 구성하는 메서드를 제공합니다.

Orleans을 클러스터링 및 곡물 스토리지를 사용하여 구성하려면, 앱 호스트 프로젝트에 📦Aspire.Hosting.Azure.Storage NuGet 패키지를 설치합니다.

dotnet add package Aspire.Hosting.Azure.Storage

다음 예제에서 Orleans 리소스는 각각 WithClusteringWithGrainStorage 메서드를 사용하여 클러스터링 및 그레인 스토리지로 구성됩니다.

// 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 리소스를 참조해야 한다는 것을 알려줍니다.

Orleans 클러스터에 참여하려면, 먼저 서비스 프로젝트의 Orleans 리소스를 참조한 후, WithReference(orleans)를 사용하여 Orleansserver로 참여하거나, WithReference(orleans.AsClient())를 사용하여 client로 참여하세요. 서비스에서 Orleans 리소스를 참조하는 경우 해당 리소스도 참조됩니다.

// Add our server project and reference your 'orleans' resource from it.
// it can join the Orleans cluster as a service.
// This implicitly add references to the required resources.
// In this case, that is the 'clusteringTable' resource declared earlier.
builder.AddProject<Projects.OrleansServer>("silo")
       .WithReference(orleans)
       .WithReplicas(3);

이 모든 것을 종합하면 다음을 포함하는 .NET.NET Aspire 앱 호스트 프로젝트의 예는 다음과 같습니다.

  • 클러스터링 및 스토리지가 있는 Orleans 리소스입니다.
  • Orleans server 프로젝트인 OrleansServer는.
  • OrleansClient는 Orleansclient 프로젝트입니다.
var builder = DistributedApplication.CreateBuilder(args);

// 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);

// Add our server project and reference your 'orleans' resource from it.
// it can join the Orleans cluster as a service.
// This implicitly add references to the required resources.
// In this case, that is the 'clusteringTable' resource declared earlier.
builder.AddProject<Projects.OrleansServer>("silo")
       .WithReference(orleans)
       .WithReplicas(3);

// 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);

// Build and run the application.
using var app = builder.Build();
await app.RunAsync();

.NET Aspire Orleans 프로젝트에서 Orleansserver 리소스를 사용하려면 다음 몇 가지 단계를 수행합니다.

  1. 관련 .NET.NET Aspire 통합을 추가합니다. 이 예제에서는 Aspire.Azure.Data.Tables 사용하고 Aspire.Azure.Storage.Blobs.
  2. 해당 Orleans 통합에 대한 .NET Aspire 공급자 패키지를 추가하십시오. 이 예제에서는 Microsoft.Orleans.Persistence.AzureStorage 사용하고 Microsoft.Orleans.Clustering.AzureStorage.
  3. 호스트 애플리케이션 작성기에서 Orleans 추가합니다.

Program.cs Orleans 프로젝트의 server 파일에서 당신이 사용하는 .NET Aspire 통합을 구성하고 호스트 빌더에 Orleans를 추가해야 합니다. 제공된 이름은 .NET.NET Aspire 앱 호스트 프로젝트에서 사용되는 것과 일치해야 합니다. 클러스터링 공급자는 "clustering"을, 그레인 상태 스토리지 공급자는 "grain-state"를 사용합니다.

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;
    }
}

OrleansClient 프로젝트에서도 마찬가지로, .NET Aspire로서 Orleans 클러스터에 조인하기 위해 필요한 client 리소스를 추가하고, 호스트 빌더를 구성하여 Orleansclient을 추가합니다.

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에서 OpenTelemetry에 대한 .NET Aspire를 구성하려면, 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을 기준으로 지원되지 않습니다.

다음 단계