ローカル開発の構成

Orleans 7.0 をターゲットとする実際のサンプル アプリケーションについては、Orleans: Hello World をご覧ください。 このサンプルは、さまざまなプラットフォームで動作する .NET コンソール アプリケーションでクライアントとサイロをホストしますが、グレインとインターフェイスは .NET Standard 2.0 をターゲットとしています。

ヒント

Orleans の旧バージョンについては、Orleans のサンプル プロジェクトをご覧ください。

サイロの構成

サイロを構成して実行するために Microsoft.Extensions.Hosting NuGet パッケージを使用することをお勧めします。 また、Orleans サイロを開発するときには、Microsoft.Orleans.Server NuGet パッケージを使用する必要があります。 ローカルでの Orleans サイロ開発では、ループバック アドレスを使用するように構成された localhost クラスタリングを構成します。 localhost クラスタリングを使用するには、UseLocalhostClustering 拡張メソッドを呼び出します。 次に示すサイロ ホストの Program.cs ファイルの例を検討します。

using Microsoft.Extensions.Hosting;

await Host.CreateDefaultBuilder(args)
    .UseOrleans(siloBuilder =>
    {
        siloBuilder.UseLocalhostClustering();;
    })
    .RunConsoleAsync();

上記のコードでは次の操作が行われます。

  • 既定のホスト ビルダーを作成します。
  • サイロを構成するための UseOrleans 拡張メソッドを呼び出します。
  • localhost クラスタリングを使用するようにサイロを構成するために、指定された ISiloBuilderUseLocalhostClustering 拡張メソッドを呼び出します。
  • サイロをコンソール アプリケーションとして実行するために、RunConsoleAsync メソッドをつなげます。

ローカル開発については、その場合にサイロを構成する方法を示す以下の例を参照してください。 loopback アドレス (サイロとゲートウェイのポートがそれぞれ 1111130000) でリッスンするサイロを構成して開始します。

Microsoft.Orleans.Server NuGet メタパッケージをプロジェクトに追加します。

dotnet add package Microsoft.Orleans.Server

ISiloBuilder Configure メソッドを使用して ClusterOptions を構成し、このサイロをプライマリとして LocalhostClustering をクラスタリングの選択肢として指定し、サイロ エンドポイントを構成する必要があります。

ConfigureApplicationParts の呼び出しで、グレイン クラスを含むアセンブリをアプリケーション セットアップに明示的に追加します。 また、WithReferences 拡張のために参照されるアセンブリも追加します。 これらの手順が完了すると、サイロ ホストが構築され、サイロが開始されます。

.NET コンソール アプリケーションとサイロをホストするための .NET Framework 4.6.1 以降をターゲットとした空のコンソール アプリケーション プロジェクトを作成することができます。

以下に、ローカル サイロを開始する方法の例を示します。

try
{
    var host = await BuildAndStartSiloAsync();

    Console.WriteLine("Press Enter to terminate...");
    Console.ReadLine();

    await host.StopAsync();
}
catch (Exception ex)
{
    Console.WriteLine(ex);
}

static async Task<ISiloHost> BuildAndStartSiloAsync()
{
    var host = new HostBuilder()
      .UseOrleans(builder =>
      {
          builder.UseLocalhostClustering()
              .Configure<ClusterOptions>(options =>
              {
                  options.ClusterId = "dev";
                  options.ServiceId = "MyAwesomeService";
              })
              .Configure<EndpointOptions>(
                  options => options.AdvertisedIPAddress = IPAddress.Loopback)
              .ConfigureLogging(logging => logging.AddConsole());
      })
      .Build();

    await host.StartAsync();

    return host;
}

クライアントの構成

(サイロに加えて) クライアントを構成して実行するために Microsoft.Extensions.Hosting NuGet パッケージを使用することをお勧めします。 また、Microsoft.Orleans.Client NuGet パッケージも必要です。 使用するクライアントで localhost クラスタリングを使用するには、UseLocalhostClustering 拡張メソッドを呼び出します。 次に示すクライアント ホストの Program.cs ファイルの例を検討します。

using Microsoft.Extensions.Hosting;

using IHost host = Host.CreateDefaultBuilder(args)
    .UseOrleansClient(client =>
    {
        client.UseLocalhostClustering();
    })
    .UseConsoleLifetime()
    .Build();

await host.StartAsync();

上記のコードでは次の操作が行われます。

  • 既定のホスト ビルダーを作成します。
  • クライアントを構成するための UseOrleansClient 拡張メソッドを呼び出します。
  • localhost クラスタリングを使用するようにクライアントを構成するために、指定された IClientBuilderUseLocalhostClustering 拡張メソッドを呼び出します。
  • コンソールの有効期間を使用するようにクライアントを構成するために、UseConsoleLifetime 拡張メソッドを呼び出します。
  • クライアントを開始するために host 変数で StartAsync メソッドを呼び出します。

ローカル開発については、その場合にクライアントを構成する方法を示す以下の例を参照してください。 loopback サイロに接続するクライアントを構成します。

Microsoft.Orleans.Client NuGet メタパッケージをプロジェクトに追加します。 API に慣れたら、Microsoft.Orleans.Client に含まれるパッケージのうち、実際に必要なものを厳密に選択し、それらを代わりに参照することができます。

Install-Package Microsoft.Orleans.Client

ローカル サイロに指定したものと一致するクラスター ID を使用して ClientBuilder を構成し、サイロのゲートウェイ ポートを指すようにクラスタリングの選択肢として静的クラスタリングを指定する必要があります。

ConfigureApplicationParts の呼び出しで、グレイン インターフェイスを含むアセンブリをアプリケーション セットアップに明示的に追加します。

これらの手順が完了したら、クライアントと、それに対する Connect() メソッドを構築して、クラスターに接続できます。

クライアントを実行するために、.NET Framework 4.6.1 以降を対象とする空のコンソール アプリケーション プロジェクトを作成するか、サイロをホストするために作成したコンソール アプリケーション プロジェクトを再利用することができます。

以下に、クライアントがローカル サイロに接続する方法の例を示します。

var client = new ClientBuilder()
    .UseLocalhostClustering()
    .Configure<ClusterOptions>(options =>
    {
        options.ClusterId = "dev";
        options.ServiceId = "MyAwesomeService";
    })
    .ConfigureLogging(logging => logging.AddConsole())
var client = builder.Build();

await client.Connect();