教學課程:建立精簡的 Orleans 應用程式
在本教學課程中,您會遵循逐步指示,以建立大部分 Orleans 應用程式通用的基礎移動元件。 它被設計為自成一體且極簡。
本教學課程缺少適當的錯誤處理,以及其他適用於生產環境的基本程序代碼。 不過,它應該可協助您實際瞭解 Orleans 的常見應用程序結構,並讓您專注於與您最相關的部分。
先決條件
項目設定
在本教學課程中,您將建立四個專案作為相同解決方案的一部分:
- 包含粒紋介面的連結庫。
- 包含穀物類別的資料庫。
- 主機孤島的主控台應用程式。
- 裝載客戶端的主控台應用程式。
在 Visual Studio 中建立 結構
將預設代碼替換為每個專案中提供的代碼。
- 首先,在新的方案中建立主控台應用程式專案。 請將專案部分命名為倉儲,並將方案命名為
OrleansHelloWorld
。 如需建立主控台應用程式的詳細資訊,請參閱 教學課程:使用 Visual Studio 建立 .NET 控制台應用程式。 - 新增另一個主控台應用程式專案,並將命名為
Client
。 - 新增類別庫並將它命名為
GrainInterfaces
。 如需建立類別庫的詳細資訊,請參閱 教學課程:使用 Visual Studio 建立 .NET 類別庫。 - 新增另一個類別庫,並將它命名為
Grains
。
刪除預設來源檔案
- 從 Grains刪除 Class1.cs。
- 從 GrainInterfaces中刪除 Class1.cs。
新增參考
- Grains 參考 GrainInterfaces。
- 穀倉 參考 穀物。
- 用戶端 參考 GrainInterfaces。
新增 Orleans NuGet 套件
專案 | NuGet 套件 |
---|---|
筒倉 | Microsoft.Orleans.Server Microsoft.Extensions.Logging.Console Microsoft.Extensions.Hosting |
客戶 | Microsoft.Orleans.Client Microsoft.Extensions.Logging.Console Microsoft.Extensions.Hosting |
粒紋介面 | Microsoft.Orleans.Sdk |
穀物 | Microsoft.Orleans.Sdk Microsoft.Extensions.Logging.Abstractions |
Microsoft.Orleans.Server
、Microsoft.Orleans.Client
和 Microsoft.Orleans.Sdk
是中繼套件,可帶來您在伺服器和用戶端上最有可能需要的依賴性。 如需新增套件參考的詳細資訊,請參閱 dotnet add package 或 使用 NuGet 套件管理員在 Visual Studio 中安裝和管理套件。
定義粒紋介面
在 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 專案,請新增程式碼來初始化裝載和執行 grain 的伺服器—silo。 您可以使用localhost叢集提供者,這可讓您在本機執行所有專案,而不需要相依於外部記憶體系統。 如需詳細資訊,請參閱 本機開發組態。 在此範例中,您會在叢集中運行一個具有單一執行單位的節點。
將下列程式代碼新增至 Program.cs 的 Silo 項目:
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 方法。
- 指定localhost叢集提供者應該與 UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) 方法搭配使用。
- 執行
host
,並等候進程終止,方法是接聽 Ctrl+C 或SIGTERM
。
建立用戶端
最後,您必須設定用戶端以與 grains 通訊,將它連線到叢集(其中只有一個 silo),然後呼叫 grain。 叢集設定必須符合您用於儲存筒倉的配置。 如需詳細資訊,請參閱 叢集和用戶端。
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 正在運行的確認訊息之後,請執行 Client。
若要從命令列啟動尋址接收器,請從包含尋址接收器專案檔的目錄執行下列命令:
dotnet run
您會在啟動 Silo 時看到許多輸出。 看到下列訊息之後,您已準備好執行用戶端:
Application started. Press Ctrl+C to shut down.
從客戶端項目目錄,在不同的終端機視窗中執行相同的 .NET CLI 命令,以啟動用戶端:
dotnet run
如需執行 .NET 應用程式的詳細資訊,請參閱 dotnet run。 如果您使用 Visual Studio,則可以 設定多個啟動專案。