1. 引言

是的,Orleans v3.0.0 已经发布了,并已经完全支持 .NET Core 3.0
所以,Orleans 系列是时候继续了,抱歉,让大家久等了。
万丈高楼平地起,这一节我们就先来了解下Orleans的基本使用。

2. 模板项目讲解

Orleans 核心概念

在上一篇文章中,我们了解到Orleans 作为.NET 分布式框架,其主要包括三个部分:Client、Grains、Silo Host(Server)。因此,为了方便讲解,创建如下的项目结构进行演示:
Hello.Orleans 项目结构

这里有几点需要说明:

  1. Orleans.Grains: 类库项目,用于定义Grain的接口以及实现,需要引用Microsoft.Orleans.CodeGenerator.MSBuildMicrosoft.Orleans.Core.Abstractions NuGet包。
  2. Orleans.Server:控制台项目,为 Silo 宿主提供宿主环境,需要引用Microsoft.Orleans.Server 和Microsoft.Extensions.HostingNuGet包,以及Orleans.Grains 项目。
  3. 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、ValueTask
紧接着定义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)     {