次の方法で共有


.NET Aspire Orleans 統合

Orleans には、.NET.NET Aspireのサポートが組み込まれています。 .NET .NET Aspireのアプリケーション モデルを使用すると、アプリ内のサービス、データベース、その他のリソースとインフラストラクチャ、およびそれらがどのように相互に関連しているかを説明できます。 Orleans は、エラスティックにスケーラブルでフォールト トレラントな分散アプリケーションを簡単に構築する方法を提供します。 .NET Aspire を使用して、クラスター メンバーシップとストレージを Orleans に提供するなどして、Orleans とその依存関係を構成および調整できます。

Orleans は、.NET Aspireのリソースとして表されます。 他の統合とは異なり、Orleans 統合ではコンテナーは作成されないため、別のクライアント統合パッケージは必要ありません。 代わりに、Orleans アプリ ホスト プロジェクトで .NET Aspire 構成を完了します。

手記

この統合には、バージョン 8.1.0 以降 Orleans 必要があります。

ホスティング統合

Orleans ホスティング統合は、Orleans サービスを OrleansService の種類としてモデル化します。 この型と API にアクセスするには、📦 プロジェクトにある AspireOrleans.Hosting. NuGet パッケージを追加してください。

dotnet add package Aspire.Hosting.Orleans

詳細については、「dotnet パッケージ の追加」または「.NET アプリケーションでのパッケージの依存関係の管理」を参照してください。

Orleans リソースを追加する

アプリ ホスト プロジェクトで、AddOrleans を呼び出して、Orleans サービス リソース ビルダーを追加して返します。 Orleans リソースに指定された名前は、診断用です。 ほとんどのアプリケーションでは、"default" の値で十分です。

var orleans = builder.AddOrleans("default")

クラスタリング テーブルとグレイン ストレージに Azure ストレージを使用する

Orleans アプリケーションにおいて、基盤となる構成要素は グレインです。 グレインは永続的な状態を持つことができます。 グレインの永続的な状態をどこかに保存する必要があります。 .NET .NET Aspire アプリケーションでは、Azure Blob Storage が可能な場所の 1 つです。

Orleans ホストはデータベースに自身を登録し、そのデータベースを使用して互いを検索し、クラスターを形成します。 どのサーバーがどのサイロのメンバーであるかをデータベース テーブルに格納します。 リレーショナル データベースまたは NoSQL データベースを使用して、この情報を格納できます。 .NET .NET Aspire アプリケーションでは、このテーブルを格納する一般的な選択肢は Azure Table Storageです。

Orleansでクラスタリングとグレイン ストレージを使用して Azure を構成するには、アプリ ホスト プロジェクトに 📦Aspire.HostingAzure.Storage NuGet パッケージをインストールします。

dotnet add package Aspire.Hosting.Azure.Storage

アプリ ホスト プロジェクトで、AddOrleansを呼び出した後、Orleans メソッドと WithClustering メソッドをそれぞれ使用して、クラスタリングとグレイン ストレージを使用して WithGrainStorage リソースを構成します。

// 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 サーバー プロジェクトを追加する

これで、.NET Aspire オーケストレーションに登録された新しいプロジェクトを、Orleans サーバーとしてソリューションに追加できるようになりました。 これは、構成グレインを持つサイロとして Orleans クラスターに参加します。 WithReference(orleans)を使用して、サーバー プロジェクトから 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);

アプリ ホストに Orleans クライアント プロジェクトを追加する

Orleans クライアントは、Orleans サーバーでホストされているグレインと通信します。 たとえば、.NET Aspire アプリでは、Orleans クラスター内のグレインを呼び出すフロントエンド Web サイトがある場合があります。 WithReference(orleans.AsClient())を使用して、Orleans クライアントから 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 サーバー プロジェクトを作成する

アプリ ホスト プロジェクトが完了したので、Orleans サーバー プロジェクトを実装できます。 まず、必要な NuGet パッケージを追加します。

Orleans サーバー プロジェクトのフォルダーで、次のコマンドを実行します。

dotnet add package Aspire.Azure.Data.Tables
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Microsoft.Orleans.Server
dotnet add package Microsoft.Orleans.Persistence.AzureStorage
dotnet add package Microsoft.Orleans.Clustering.AzureStorage

次に、Orleans サーバー プロジェクトの Program.cs ファイルで、Azure Storage BLOB およびテーブル クライアントを追加し、UseOrleansを呼び出します。

var builder = WebApplication.CreateBuilder(args);

builder.AddServiceDefaults();
builder.AddKeyedAzureTableClient("clustering");
builder.AddKeyedAzureBlobClient("grain-state");
builder.UseOrleans();

次のコードは、CounterGrainという名前のグレインを含む、Orleans サーバー プロジェクトの完全な例です。

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 クライアント プロジェクトを作成する

Orleans クライアント プロジェクトで、同じ NuGet パッケージを追加します。

dotnet add package Aspire.Azure.Data.Tables
dotnet add package Aspire.Azure.Storage.Blobs
dotnet add package Microsoft.Orleans.Client
dotnet add package Microsoft.Orleans.Persistence.AzureStorage
dotnet add package Microsoft.Orleans.Clustering.AzureStorage

次に、Orleans クライアント プロジェクトの Program.cs ファイルで、Azure テーブル ストレージ クライアントを追加し、UseOrleansClientを呼び出します。

builder.AddKeyedAzureTableClient("clustering");
builder.UseOrleansClient();

次のコードは、Orleans クライアント プロジェクトの完全な例です。 これは、上記の Orleans サーバーの例で定義されている 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で 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 ストレージ テーブル
    • ストレージ BLOB の Azure
  • アラーム:
    • Redis
    • Azure ストレージ テーブル
  • 穀物ディレクトリ
    • Redis
    • Azure ストレージ テーブル

ストリーミング プロバイダーは、Orleans バージョン 8.1.0 以降ではサポートされていません。

次の手順