共用方式為


教學課程:建立精簡的 Orleans 應用程式

在本教學課程中,您會遵循逐步指示,以建立大部分 Orleans 應用程式通用的基礎移動元件。 它被設計為自成一體且極簡。

本教學課程缺少適當的錯誤處理,以及其他適用於生產環境的基本程序代碼。 不過,它應該可協助您實際瞭解 Orleans 的常見應用程序結構,並讓您專注於與您最相關的部分。

先決條件

項目設定

在本教學課程中,您將建立四個專案作為相同解決方案的一部分:

  • 包含粒紋介面的連結庫。
  • 包含穀物類別的資料庫。
  • 主機孤島的主控台應用程式。
  • 裝載客戶端的主控台應用程式。

在 Visual Studio 中建立 結構

將預設代碼替換為每個專案中提供的代碼。

  1. 首先,在新的方案中建立主控台應用程式專案。 請將專案部分命名為倉儲,並將方案命名為 OrleansHelloWorld。 如需建立主控台應用程式的詳細資訊,請參閱 教學課程:使用 Visual Studio 建立 .NET 控制台應用程式
  2. 新增另一個主控台應用程式專案,並將命名為 Client
  3. 新增類別庫並將它命名為 GrainInterfaces。 如需建立類別庫的詳細資訊,請參閱 教學課程:使用 Visual Studio 建立 .NET 類別庫
  4. 新增另一個類別庫,並將它命名為 Grains

刪除預設來源檔案

  1. Grains刪除 Class1.cs
  2. GrainInterfaces中刪除 Class1.cs

新增參考

  1. Grains 參考 GrainInterfaces
  2. 穀倉 參考 穀物
  3. 用戶端 參考 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.ServerMicrosoft.Orleans.ClientMicrosoft.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.csSilo 項目:

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();

上述程式代碼:

建立用戶端

最後,您必須設定用戶端以與 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,則可以 設定多個啟動專案。

另請參閱