Orleans 知多少 | 3. Hello Orleans
1. 引言
是的,Orleans v3.0.0 已经发布了,并已经完全支持 .NET Core 3.0。
所以,Orleans 系列是时候继续了,抱歉,让大家久等了。
万丈高楼平地起,这一节我们就先来了解下Orleans的基本使用。
2. 模板项目讲解
在上一篇文章中,我们了解到Orleans 作为.NET 分布式框架,其主要包括三个部分:Client、Grains、Silo Host(Server)。因此,为了方便讲解,创建如下的项目结构进行演示:
这里有几点需要说明:
- Orleans.Grains: 类库项目,用于定义Grain的接口以及实现,需要引用
Microsoft.Orleans.CodeGenerator.MSBuild
和Microsoft.Orleans.Core.Abstractions
NuGet包。 - Orleans.Server:控制台项目,为 Silo 宿主提供宿主环境,需要引用
Microsoft.Orleans.Server
和Microsoft.Extensions.Hosting
NuGet包,以及Orleans.Grains
项目。 - Orleans.Client:控制台项目,用于演示如何借助Orleans Client建立与Orleans Server的连接,需要引用
Microsoft.Orleans.Client
和Microsoft.Extensions.Hosting
NuGet包,同时添加Orleans.Grains
项目引用。
3. 第一个Grain
Grain作为Orleans的第一公民,以及Virtual Actor的实际代言人,想吃透Orleans,那Grain就是第一道坎。
先看一个简单的Demo,我们来模拟统计网站的实时在线用户。
在Orlean s.Grains
添加ISessionControl
接口,主要用户登录状态的管理。
public interface ISessionControlGrain : IGrainWithStringKey { Task Login(string userId); Task Logout(string userId); Task<int> GetActiveUserCount(); }
可以看见Grain的定义很简单,只需要指定继承自IGrain的接口就好。这里面继承自IGrainWithStringKey
,说明该Grain 的Identity Key(身份标识)为string
类型。同时需要注意的是
Grain 的方法申明,返回值必须是: Task、Task
紧接着定义SessionControlGrain
来实现ISessionControlGrain
接口。
public class SessionControlGrain : Grain, ISessionControlGrain { private List<string> LoginUsers { get; set; } = new List<string>(); public Task Login(string userId) { //获取当前Grain的身份标识(因为ISessionControlGrain身份标识为string类型,GetPrimaryKeyString()); var appName = this.GetPrimaryKeyString(); LoginUsers.Add(userId); Console.WriteLine($"Current active users count of {appName} is {LoginUsers.Count}"); return Task.CompletedTask; } public Task Logout(string userId) {