介绍
Orleans 由 Microsoft Research 创建和设计,用于云计算。被微软广泛应用于多个产品,尤其在游戏领域的云服务平台。也被其它公司采用。
Orleans 于 2015 年 1 月开放源码,在开发者社区、Orleans 团队及微软的积极协作下,Orleans 已成为构建分布式系统和云服务的首选框架。
Orleans 是一个用于构建健壮、可伸缩的分布式应用程序的跨平台框架。
Orleans 是基于 .NET 开发,可以构建单个本地服务器扩展到云服务、高可用的应用程序。
Orleans 的核心在于它的编程模型(Virtual Actor Model),Virtual Actor Model 已然成为构建新一代分布式系统的新方法。关于更多 Virtual Actor Model 可以网上查找相关资料。
开发人员在遵从 Orleans 规则下,不限制功能,来降低高并发分布式系统的复杂性。
下面我们来快速创建一个 Orleans 应用程序。
开发工具使用 Visual Studio 2022,使用 .NET 6 的SDK 来开发。请提前准备好。
创建 Orleans 应用程序
1、创建一个名为 Yld
的解决方案。在解决方案下,分别创建四个项目
- 包含 Grains 接口的类库 —— IDemoGrains
- 包含 Grains 类库 —— DemoGrains
- Silos 控制台应用程序 —— DemoSilo
- Client 控制台应用程序 —— DemoClient
最终解决方案如下图:
2、 添加 NuGet 包
项目名称 | 引用包 |
---|---|
DemoClient | Microsoft.Orleans.Client |
Microsoft.Extensions.Logging.Console | |
DemoGrains | Microsoft.Extensions.Logging.Abstractions |
Microsoft.Orleans.CodeGenerator.MSBuild | |
Microsoft.Extensions.Logging.Abstractions | |
DemoSilo | Microsoft.Orleans.Server |
Microsoft.Extensions.Logging.Console | |
IDemoGrains | Microsoft.Orleans.Core.Abstractions |
Microsoft.Orleans.CodeGenerator.MSBuild |
3、在 IDemoGrains 项目创建一个 IHelloGrain 接口,且继承 IGrainWithIntegerKey
public interface IHelloGrain : IGrainWithIntegerKey
{
Task<string> SayHello(string msg);
}
4、在 DemoGrains 项目创建一个 HelloGrain 类,并继承 Grain 类和 IHelloGrain 接口,且该项目需添加 IDemoGrains 引用
public class HelloGrain : Grain, IHelloGrain
{
private readonly ILogger logger;
public HelloGrain(ILogger<HelloGrain> logger)
{
this.logger = logger;
}
public Task<string> SayHello(string msg)
{
logger.LogInformation($"\n SayHello 方法收到客户端发来的消息:'{msg}'");
return Task.FromResult($"客户端发了消息,你不回点都不好意思?\n来而不往非礼也");
}
}
5、在 DemoSilo 项目中配置 Silo 服务端,且DemoSilo 添加 DemoGrain 和 IDemoGrain 引用。 DemoSilo 项目中Program 的代码修改如下
using Microsoft.Extensions.Logging;
using DemoGrains;
using Orleans;
using Orleans.Configuration;
using Orleans.Hosting;
// 配置 host
using var host = new SiloHostBuilder()
// 因为是本地开发, silo 使用 localhost 集群
.UseLocalhostClustering()
//配置集群Id 和 服务Id
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";
options.ServiceId = "YldDemoService";
})
//应用程序部分:只需引用我们使用的 Grain 实现
.ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences())
//配置日志输出到控制台
.ConfigureLogging(logging => logging.AddConsole())
//创建 silo
.Build();
// 启动 host
await host.StartAsync();
Console.WriteLine("\n\n 按 Enter 终止...\n\n");
Console.ReadLine();
await host.StopAsync();
具体配置代码里有相应的注释,就略过
6、在 DemoClient 项目中配置客户端,及如何调用;DemoClient 添加 IDemoGrains 引用。Program 类代码如下
using IDemoGrains;
using Microsoft.Extensions.Logging;
using Orleans;
using Orleans.Configuration;
using var client = new ClientBuilder()
// 这里配置与 Silo 相同
.UseLocalhostClustering()
//与 Silo 配置的服务一样,否则客户端会连接失败
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";
options.ServiceId = "YldDemoService";
})
.ConfigureLogging(logging => logging.AddConsole())
.Build();
await client.Connect();
var helloGrain = client.GetGrain<IHelloGrain>(1);
var response = await helloGrain.SayHello("你好, Grain!");
Console.WriteLine("\n\n{0}\n\n", response);
Console.ReadKey();
7、先运行 DemoSilo ,然后再运行 DemoClient。成功运行如下图
简单的分布式应用程序就构建完成。在相比以前或其它框架来说简单了很多。
从上面的代码可以看到,Orleans 的基本构建模块是基于 Grains 。外部通过 Grains 定义的接口方法进行调用。这里先熟悉一下。
今天,就先体验下 Orleans 。后面一起解锁更多的用法。
最后,祝大家学习愉快!