教程:创建最小 Orleans 应用程序

在本教程中,按照分步说明创建大多数 Orleans 应用程序通用的基础移动部件。 它设计为自包含和极简。

本教程缺少适用于生产环境的适当错误处理和其他基本代码。 但是,它应该有助于你深入了解常见的 Orleans 应用结构,并允许你专注于与你最相关的部分。

先决条件

项目设置

对于本教程,请创建四个项目作为同一解决方案的一部分:

  • 包含 grain 接口的库。
  • 包含 grain 类的库。
  • 用于托管 Silo 的控制台应用。
  • 用于托管客户端的控制台应用。

在 Visual Studio 中创建结构

将默认代码替换为为每个项目提供的代码。

  1. 首先,在新解决方案中创建控制台应用项目。 调用项目 Silo 并命名解决方案 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 包

项目 NuGet 包
筒仓 Microsoft.Orleans.Server
Microsoft.Extensions.Logging.Console
Microsoft.Extensions.Hosting
客户 Microsoft.Orleans.Client
Microsoft.Extensions.Logging.Console
Microsoft.Extensions.Hosting
GrainInterfaces Microsoft.Orleans.Sdk
谷物 Microsoft.Orleans.Sdk
Microsoft.Extensions.Logging.Abstractions

Microsoft.Orleans.ServerMicrosoft.Orleans.ClientMicrosoft.Orleans.Sdk 是元软件包,能够为你在 Silo 和客户端上提供最可能需要的依赖项。 有关添加包引用的详细信息,请参阅 dotnet package add在 Visual Studio 中使用 NuGet 包管理器安装和管理包

定义粒度接口

GrainInterfaces 项目中,添加 IHello.cs 代码文件并定义以下 IHello 接口:

namespace GrainInterfaces;

public interface IHello : IGrainWithIntegerKey
{
    ValueTask<string> SayHello(string greeting);
}

定义 grain 类

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

前面的代码:

创建客户端

最后,将客户端配置为与粒度通信,将其连接到群集(使用单个接收器),并调用粒度。 集群配置必须与用于筒仓的配置匹配。 有关详细信息,请参阅 群集和客户端

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,则可以 配置多个启动项目。

另请参阅