個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Microsoft MVP for Developer Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

Orleans の構成要素:フロントエンド

フロントエンドの役割

 

フロントエンドは、www と Orleans の世界のゲートウェイの役割を果たします。
( REST API と Orleans 独自の世界を相互変換する境界)

公開されている REST API への HTTP リクエストを受信して、リクエストを処理すべき Grain に対してメソッドをコールし、 Grain からレスポンスを受け取り、 HTTP リクエストにレスポンスを返します。

なお、 フロントエンドは Orleans クラスターから見ればクライアントでもあります。
 
 

フロントエンドの実装例

 
Minimum なフロントエンドの実装としては、ASP.NET Core Minimal Web API のプロジェクトで REST API を定義し、Generic Host で Orleans クラアントを起動し、Grain プロキシオブジェクトのメソッドをコールし、戻り値を返します。
 

using Orleans.Configuration;
using OrleansPoc;

var host = await StartClientAsync();
var client = host.Services.GetRequiredService<IClusterClient>();
var hello = client.GetGrain<IHello>(Guid.NewGuid());
var writeLargeData = client.GetGrain<IWriteLargeData>(Guid.NewGuid());

var app = WebApplication.Create();
app.MapGet("/", async () => await hello.Call());
app.MapGet("/hello", async () => await hello.SayHello($"Konnichiwa!!"));
app.MapGet("/deactivate", async () => await hello.Deactivate());
app.MapGet("/writelargedata", async () => await writeLargeData.WriteLargeData());
await app.RunAsync();

static async Task<IHost> StartClientAsync()
{
    var connectionString = Environment.GetEnvironmentVariable("ORLEANS_AZURE_STORAGE_CONNECTION_STRING");

    var builder = new HostBuilder()
        .UseOrleansClient(client =>
        {
            client
                .UseAzureStorageClustering(
                    options => options.ConfigureTableServiceClient(connectionString))
                .Configure<ClusterOptions>(options =>
                {
                    options.ClusterId = "PoCCluster";
                    options.ServiceId = "OrleansPoC";
                });
        })
        .ConfigureLogging(logging => logging.AddConsole());

    var host = builder.Build();
    await host.StartAsync();

    return host;
}

 
 
次の記事はこちらです。
hiro128.hatenablog.jp