在本教學課程中,請遵循逐步指示來建立大部分 Orleans 應用程式通用的基礎移動元件。 它被設計為自成一體且極簡。
本教學課程缺少適當的錯誤處理,以及其他適用於生產環境的基本程序代碼。 不過,它應該可協助您實際瞭解常見的 Orleans 應用程序結構,並讓您將持續學習的焦點放在與您最相關的部分。
小提示
對於生產環境就緒 Orleans 的應用程式,建議使用 .NET Aspire 來簡化資源管理、服務發現、可觀察性與部署。 Aspire 自動處理叢集、資料儲存、提醒與串流設定。 詳情請參閱 .NET Aspire Orleans 整合 。
先決條件
項目設定
在本教學課程中,建立四個專案作為相同解決方案的一部分:
- 包含粒紋介面的連結庫。
- 包含穀物類別的資料庫。
- 主機孤島的主控台應用程式。
- 裝載客戶端的主控台應用程式。
在 Visual Studio 中建立 結構
將系統預設程式代碼替換為各專案提供的程式代碼。
- 首先,在新的方案中建立主控台應用程式專案。 呼叫專案
Silo,並將方案OrleansHelloWorld命名為 。 如需建立主控台應用程式的詳細資訊,請參閱 教學課程:使用 Visual Studio 建立 .NET 控制台應用程式。 - 新增另一個主控台應用程式專案,並將命名為
Client。 - 新增類別庫並將它命名為
GrainInterfaces。 如需建立類別庫的詳細資訊,請參閱 教學課程:使用 Visual Studio 建立 .NET 類別庫。 - 新增另一個類別庫,並將它命名為
Grains。
刪除預設來源檔案
- 從 Grains刪除 Class1.cs。
- 從 GrainInterfaces中刪除 Class1.cs。
新增參考
- Grains 參考 GrainInterfaces。
- 穀倉 參考 穀物。
- 用戶端 參考 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 是中繼套件,可帶來您在 Silo 和用戶端上最有可能需要的相依性。 如需新增套件參考的詳細資訊,請參閱 使用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等候進程終止。
建立用戶端
最後,設定用戶端以與Grain通訊、將它連線到叢集(使用單一儲存槽),然後叫用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 正在運行的確認訊息後,請執行 用戶端。
若要從命令列啟動尋址接收器,請從包含尋址接收器專案檔的目錄執行下列命令:
dotnet run
您會在 Silo 啟動時看到許多輸出。 看到下列訊息之後,您就可以執行用戶端:
Application started. Press Ctrl+C to shut down.
從客戶端項目目錄,在不同的終端機視窗中執行相同的 .NET CLI 命令,以啟動用戶端:
dotnet run
如需執行 .NET 應用程式的詳細資訊,請參閱 dotnet run。 如果您使用 Visual Studio,則可以 設定多個啟動專案。