このチュートリアルでは、手順に従って、ほとんどの Orleans アプリケーションに共通する基本的な可動部分を作成します。 自己完結型でミニマルなデザインです。
このチュートリアルには、運用環境に役立つ適切なエラー処理やその他の重要なコードがありません。 ただし、一般的な Orleans アプリの構造を実際に理解し、最も関連性の高い部分に継続的な学習に集中できるようにする必要があります。
ヒント
運用対応の Orleans アプリケーションの場合は、 .NET Aspire を使用して、リソース管理、サービス検出、監視、デプロイを簡略化することを検討してください。 Aspireは、クラスタリング、グレインストレージ、リマインダー、ストリーミングの構成を自動的に処理します。 詳細については、 .NET のアスパイア Orleans 統合 に関するページを参照してください。
前提 条件
プロジェクトのセットアップ
このチュートリアルでは、同じソリューションの一部として 4 つのプロジェクトを作成します。
- グレイン インターフェイスを格納するためのライブラリ。
- グレイン クラスを格納するライブラリ。
- サイロをホストするコンソール アプリ。
- クライアントをホストするコンソール アプリ。
Visual Studio で構造を作成する
既定のコードを、各プロジェクトに指定されたコードに置き換えます。
- まず、新しいソリューションでコンソール アプリ プロジェクトを作成します。 プロジェクト
Siloを呼び出し、ソリューションOrleansHelloWorldに名前を付けます。 コンソール アプリの作成の詳細については、「チュートリアル: Visual Studioを使用して .NET コンソール アプリケーションを作成する」を参照してください。 - 別のコンソール アプリ プロジェクトを追加し、
Client名前を付けます。 - クラス ライブラリを追加し、
GrainInterfaces名前を付けます。 クラス ライブラリの作成の詳細については、「チュートリアル: Visual Studioを使用して .NET クラス ライブラリを作成する」を参照してください。 - 別のクラス ライブラリを追加し、
Grains名前を付けます。
既定のソース ファイルを削除する
- Class1.cs を グレインから削除します。
- GrainInterfaces から Class1.cs を削除します。
参照の追加
- Grains は GrainInterfaces を参照します。
- Silo は Grains を参照します。
- Client は GrainInterfaces を参照します。
Orleans のNuGetパッケージを追加する
| プロジェクト | NuGet パッケージ |
|---|---|
| サイロ | Microsoft.Orleans.ServerMicrosoft.Extensions.Logging.ConsoleMicrosoft.Extensions.Hosting |
| クライアント | Microsoft.Orleans.ClientMicrosoft.Extensions.Logging.ConsoleMicrosoft.Extensions.Hosting |
| グレイン インターフェイス | Microsoft.Orleans.Sdk |
| 穀類 | Microsoft.Orleans.SdkMicrosoft.Extensions.Logging.Abstractions |
Microsoft.Orleans.Server、 Microsoft.Orleans.Client、および Microsoft.Orleans.Sdk は、サイロとクライアントに必要になる可能性が最も高い依存関係をもたらすメタパッケージです。 パッケージ参照の追加の詳細については、NuGet パッケージ マネージャーを使用した Visual Studio での dotnet パッケージの追加またはパッケージのインストールと管理に関するページを参照してください。
グレイン インターフェイスを定義する
GrainInterfaces プロジェクトで、IHello.csコード ファイルを追加し、次のIHello インターフェイスを定義します。
namespace GrainInterfaces;
public interface IHello : IGrainWithIntegerKey
{
ValueTask<string> SayHello(string greeting);
}
グレイン クラスを定義する
Grains プロジェクトで、HelloGrain.csコード ファイルを追加し、次のクラスを定義します。
using GrainInterfaces;
using Microsoft.Extensions.Logging;
namespace Grains;
public class HelloGrain : Grain, IHello
{
private readonly ILogger _logger;
public HelloGrain(ILogger<HelloGrain> logger) => _logger = logger;
ValueTask<string> IHello.SayHello(string greeting)
{
_logger.LogInformation("""
SayHello message received: greeting = "{Greeting}"
""",
greeting);
return ValueTask.FromResult($"""
Client said: "{greeting}", so HelloGrain says: Hello!
""");
}
}
サイロを作成する
Silo プロジェクトを作成するには、Grains (Silo) をホストして実行するサーバーを初期化するコードを追加します。 localhost クラスタリング プロバイダーを使用します。これにより、外部ストレージ システムに依存せずにすべてをローカルで実行できます。 詳細については、「ローカル開発構成 」を参照してください。 この例では、単一のサイロでクラスターを実行します。
Silo プロジェクトの Program.cs に次のコードを追加します。
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseOrleans(silo =>
{
silo.UseLocalhostClustering()
.ConfigureLogging(logging => logging.AddConsole());
})
.UseConsoleLifetime();
using IHost host = builder.Build();
await host.RunAsync();
上記のコード:
- IHost メソッドで Orleans を使用するように UseOrleans を構成します。
- UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) メソッドで localhost クラスタリング プロバイダーを使用して指定します。
-
hostを実行し、+ またはをリッスンしてプロセスが終了するまで待機します。
クライアントを作成する
最後に、クライアントを構成して、グレインと通信し、クラスターに接続して (単一のサイロを使用して)、グレインを呼び出します。 クラスタリング構成は、サイロに使用される構成と一致する必要があります。 詳細については、「クラスターとクライアントの」を参照してください。
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using GrainInterfaces;
IHostBuilder builder = Host.CreateDefaultBuilder(args)
.UseOrleansClient(client =>
{
client.UseLocalhostClustering();
})
.ConfigureLogging(logging => logging.AddConsole())
.UseConsoleLifetime();
using IHost host = builder.Build();
await host.StartAsync();
IClusterClient client = host.Services.GetRequiredService<IClusterClient>();
IHello friend = client.GetGrain<IHello>(0);
string response = await friend.SayHello("Hi friend!");
Console.WriteLine($"""
{response}
Press any key to exit...
""");
Console.ReadKey();
await host.StopAsync();
アプリケーションを実行する
ソリューションをビルドし、Siloを実行します。 サイロが実行されていることを示す確認メッセージを受信したら、クライアントを実行します。
コマンド ラインから Silo を開始するには、Silo のプロジェクト ファイルを含むディレクトリから次のコマンドを実行します。
dotnet run
サイロのスタートアップの一部として、多数の出力が表示されます。 次のメッセージが表示されたら、クライアントを実行する準備ができました。
Application started. Press Ctrl+C to shut down.
クライアント プロジェクト ディレクトリから、別のターミナル ウィンドウで同じ .NET CLI コマンドを実行して、クライアントを起動します。
dotnet run
.NET アプリの実行の詳細については、「dotnet run」を参照してください。 Visual Studio を使用している場合は、複数のスタートアップ プロジェクトを構成できます。
関連項目
.NET