教學課程:建立最小 Orleans 應用程式
在本教學課程中,您會遵循逐步指示來建立大部分 Orleans 應用程式通用的基礎移動組件。 其設計具有獨立和極簡特性。
本教學課程缺少適當的錯誤處理,以及其他適用於實際執行環境的基本程式碼。 不過,它應該可協助您實際了解 Orleans 的常見應用程式結構,並讓您專注於與您最相關的部分。
必要條件
專案設定
在本教學課程中,您將建立四個專案作為相同解決方案的一部分:
- 包含精細度介面的程式庫。
- 包含精細度類別的程式庫。
- 用來裝載定址接收器的主控台應用程式。
- 用來裝載用戶端的主控台應用程式。
在 Visual Studio 中建立結構
將預設程式碼取代為針對每個專案所提供的程式碼。
- 首先,在新的解決方案中建立主控台應用程式專案。 呼叫專案組件定址接收器,並將方案命名為
OrleansHelloWorld
。 如需建立主控台應用程式的詳細資訊,請參閱教學課程:使用 Visual Studio 建立 .NET 主控台應用程式。 - 新增另一個主控台應用程式專案,並將其命名為
Client
。 - 新增類別庫,並將其命名為
GrainInterfaces
。 如需建立類別庫的相關資訊,請參閱教學課程:使用 Visual Studio 建立 .NET 類別庫。 - 新增另一個類別庫,並將其命名為
Grains
。
刪除預設來源檔案
- 從 Grains 刪除 Class1.cs。
- 從 GrainInterfaces 刪除 Class1.cs。
新增參考
- Grains 會參考 GrainInterfaces。
- Silo 會參考 Grains。
- Client 會參考 GrainInterfaces。
新增 Orleans NuGet 套件
Project | 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 新增套件或使用 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!
""");
}
}
建立定址接收器
若要建立定址接收器專案,請新增程式碼來初始化裝載和執行粒紋的伺服器,也就是定址接收器。 您可以使用 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 設定為搭配 UseOrleans 方法使用 Orleans。
- 指定 localhost 叢集提供者應該搭配 UseLocalhostClustering(ISiloBuilder, Int32, Int32, IPEndPoint, String, String) 方法使用。
- 執行 並
host
等候處理程序終止,方法是接聽 Ctrl+C 或SIGTERM
。
建立用戶端
最後,您必須設定用戶端以與粒紋通訊、將它連線到叢集 (其中具有單一定址接收器),然後叫用粒紋。 叢集設定必須符合您用於定址接收器的設定。 如需詳細資訊,請參閱叢集和用戶端
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
您會在啟動定址接收器過程中看到許多輸出。 看到下列訊息之後,表示您已準備好執行用戶端:
Application started. Press Ctrl+C to shut down.
從用戶端專案目錄,在不同的終端視窗中執行相同的 .NET CLI 命令,以啟動用戶端:
dotnet run
如需執行 .NET 應用程式的詳細資訊,請參閱 dotnet run。 如果您使用 Visual Studio,您可以設定多個啟動專案。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應