Share via


教學課程:建立最小 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. Silo 會參考 Grains
  3. 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.ServerMicrosoft.Orleans.ClientMicrosoft.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();

上述 程式碼:

建立用戶端

最後,您必須設定用戶端以與粒紋通訊、將它連線到叢集 (其中具有單一定址接收器),然後叫用粒紋。 叢集設定必須符合您用於定址接收器的設定。 如需詳細資訊,請參閱叢集和用戶端

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,您可以設定多個啟動專案

另請參閱