Orleans[NET Core 3.1] 学习笔记(四)( 1 )创建项目

ClassRoom

ClassRoom是一个练手demo,目的是为了能熟悉掌握Orleans的基本知识和使用方法,我会尽量在这个项目中加入更多的知识点,一边学一边练避免我看完文档就忘掉

创建项目

依旧是四个项目起步

项目名称 项目类型 项目说明
IGrains .net Core 3.1 类库 Grain接口库
Grains .net Core 3.1 类库 实现Grain的类库
Silo_ConsoleApp .net Core 3.1 控制台 Silo服务
Client_ConsoleApp .net Core 3.1 控制台 客户端程序

引用类库

IGrains
Microsoft.Orleans.Core.Abstractions(3.0.2)
Microsoft.Orleans.CodeGenerator.MSBuild(3.0.2)

Grains
Microsoft.Orleans.Core.Abstractions(3.0.2)
Microsoft.Orleans.CodeGenerator.MSBuild(3.0.2)

Silo_ConsoleApp
Microsoft.Orleans.Server(3.0.2)

Client_ConsoleApp
Microsoft.Orleans.Client(3.0.2)

IGrains 定义

using System.Threading.Tasks;namespace IGrains{    /// <summary>    /// 学生    /// </summary>    public interface IStudent : Orleans.IGrainWithIntegerKey    {        /// <summary>        /// 打招呼        /// </summary>        /// <returns></returns>        Task<string> SayHello();    }}

注意Orleans.IGrainWithIntegerKey,这个决定了Grain的key的类型,是long还是string,或者Guid.

再加个控制台日志帮助类

using System;namespace IGrains{    /// <summary>    /// 控制台帮助类    /// </summary>    public static class ConsoleHelper    {        static void WriteColorLine(string str, ConsoleColor color)        {            ConsoleColor currentForeColor = Console.ForegroundColor;            Console.ForegroundColor = color;            Console.WriteLine(str);            Console.ForegroundColor = currentForeColor;        }        /// <summary>        /// 打印错误信息        /// </summary>        /// <param name="str">待打印的字符串</param>        /// <param name="color">想要打印的颜色</param>        public static void WriteErrorLine(this string str, ConsoleColor color = ConsoleColor.Red)        {            WriteColorLine(str, color);        }        /// <summary>        /// 打印警告信息        /// </summary>        /// <param name="str">待打印的字符串</param>        /// <param name="color">想要打印的颜色</param>        public static void WriteWarningLine(this string str, ConsoleColor color = ConsoleColor.Yellow)        {            WriteColorLine(str, color);        }        /// <summary>        /// 打印正常信息        /// </summary>        /// <param name="str">待打印的字符串</param>        /// <param name="color">想要打印的颜色</param>        public static void WriteInfoLine(this string str, ConsoleColor color = ConsoleColor.White)        {            WriteColorLine(str, color);        }        /// <summary>        /// 打印成功的信息        /// </summary>        /// <param name="str">待打印的字符串</param>        /// <param name="color">想要打印的颜色</param>        public static void WriteSuccessLine(this string str, ConsoleColor color = ConsoleColor.Green)        {            WriteColorLine(str, color);        }    }}

Grains 定义

using IGrains;using System;using System.Threading.Tasks;namespace Grains{    /// <summary>    /// 学生     /// </summary>    public class Student : Orleans.Grain, IStudent    {        /// <summary>        /// 打招呼        /// </summary>        /// <returns></returns>        public Task<string> SayHello()        {            var id = this.GrainReference.GrainIdentity.PrimaryKeyLong;//当前Grain的key            Console.WriteLine($"\n {id}收到SayHello消息 \n");            return Task.FromResult($"\n 大家好,我是{id} \n");        }    }}

这里我使用了GrainReference.GrainIdentity.PrimaryKeyLong,这个值就是当前Grain的idkey值,有了它Grain才能知道自己是谁. =_=!

Silo_ConsoleApp

using Grains;using Orleans;using Orleans.Configuration;using Orleans.Hosting;using System;using System.Net;using System.Threading.Tasks;namespace Silo_ConsoleApp{    class Program    {        static async Task Main(string[] args)        {            Console.WriteLine("开始启动Silo!");            try            {                var host = await StartSilo();                Console.WriteLine("Silo启动完成");                Console.WriteLine("\n\n 按回车键停止 \n\n");                Console.ReadLine();                await host.StopAsync();//停止当前Silo                return;            }            catch (Exception ex)            {                Console.WriteLine(ex);                return;            }        }        /// <summary>        /// 启动本地配置        /// </summary>        /// <returns></returns>        private static async Task<ISiloHost> StartSilo()        {            var host = new SiloHostBuilder()                 .UseLocalhostClustering()                     //配置Silo只使用开发集群,并监听本地主机。                 .Configure<ClusterOptions>(options =>                 {                     options.ClusterId = "dev";                     options.ServiceId = "MyHost";             //获取或设置此服务的唯一标识符,该标识符应在部署和重新部署后仍然有效                 })                 .Configure<EndpointOptions>(options => options.AdvertisedIPAddress = IPAddress.Loopback)//配置Silo的端口                 .ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(Student).Assembly).WithReferences())                 .Build();            await host.StartAsync();//启动当前Silo.            return host;        }    }}

先用本地开发配置

Client_ConsoleApp

using IGrains;using Orleans;using Orleans.Configuration;using System;using System.Threading.Tasks;namespace Client_ConsoleApp{    class Program    {        static async Task Main(string[] args)        {            Console.WriteLine("开始启动Silo!");            try            {                using (var client = await ConnectClient())                {                    Console.WriteLine("客户端已成功连接到Silo Host  \n");                    await DoClientWork(client);                }            }            catch (Exception ex)            {                Console.WriteLine(ex);            }            Console.WriteLine("\n\n 按任意键退出 \n\n");            Console.ReadKey();            return;        }        private static async Task DoClientWork(IClusterClient client)        {            //从客户端调用Grain的示例            var student = client.GetGrain<IStudent>(321);            var response = await student.SayHello();            Console.WriteLine("\n\n{0}\n\n", response);        }        /// <summary>        /// 使用本地配置连接服务        /// </summary>        /// <returns></returns>        private static async Task<IClusterClient> ConnectClient()        {            IClusterClient client;            client = new ClientBuilder()                .UseLocalhostClustering()           //配置客户端以连接到本地主机上的筒仓。                .Configure<ClusterOptions>(options =>                {                    options.ClusterId = "dev";                    options.ServiceId = "MyHost";                })                .Build();            await client.Connect();            return client;        }    }}

同样适用本地配置

修改发布设置

.net core 的程序有个比较烦的地方,每次编译都会编译出来一大堆文件,看着心烦。

还好微软给了咱一个单文件发布的方法,可以把这些文件打到一个文件里,下面我来举个栗子

右键Silo_ConsoleApp项目,选择发布,然后选择发布到本地文件夹,修改为如下配置:

然后点一下发布,咱们在选择的文件夹里就能看到它了:

Client_ConsoleApp可以执行同样的操作

运行程序

咱们把Silo和Client程序都跑起来,注意,要先启动Silo程序,等待Silo启动成功后再启动Client。

运行效果如下:

便捷路由

目录Orleans[NET Core 3.1] 学习笔记(一).NET环境下的分布式应用程序

上一节Orleans[NET Core 3.1] 学习笔记(三)( 3 )服务端配置

下一节Orleans[NET Core 3.1] 学习笔记(四)( 2 )获取Grain的方式

(0)

相关推荐

  • 动手实现一个适用于.NET Core 的诊断工具

    今天 以下文章来源于全球技术精选 ,作者SpringLeee 全球技术精选dotnet 国内外新鲜技术资讯,优秀博客,开源项目分享平台 前言 大家可能对诊断工具并不陌生,从大名鼎鼎的 dotTrace ...

  • Orleans[NET Core 3.1] 学习笔记(三)( 3 )服务端配置

    服务端配置 Silo通过SiloHostBuilder和许多补充选项类以编程方式进行配置. Silo配置有几个关键方面: Orleans集群信息 集群提供程序(不知道咋翻译) Silo到Silo和Cl ...

  • 《中医基础理论》学习笔记(四)

    阴阳学说 阴阳学说是在气一元论的基础上建立起来的中国古代的朴素的对立统一理论,属于中国古代唯物论和辩证法范畴,体现出中华民族辩证思维的特殊精神. 阴阳学说认为:世界是物质性的整体,宇宙间一切事物不仅其 ...

  • 学习笔记四

    蒋介石逃离大陆带走两样东西,泥土和<论持久战>,一个黄埔军校的校长都写不出这样的书.毛主席能把坏事变好事,共产党通过抗日人越来越多. 你越不在乎,反而越在乎你. 自以为是的人也敬畏副班. ...

  • flask学习笔记(四):利用render

    基础 render_template()有什么用 在Python代码中 直接生成 HTML 缺点很多,比如笨拙,效率低,可读性差.因此, Flask 提供了 Jinja2 模板引擎来帮助开发者高效灵活 ...

  • 没有OPC油路的上汽调节型阀门油动机油路什么样(学习笔记四)

    EH油系统学习推荐: EH油系统为什么设有压回油?有什么用?怎么形成压力?? 为什么EH油泵大多都用柱塞泵? 机组打闸后,EH油流量是变大还是变小?EH油压下降较多怎么办? 上汽600MW超临界机组D ...

  • 为什么发电机内没有压力,氢侧油箱无法自动排油?(启动学习笔记四))

    前几日学习双环流密封油系统大概的工作流程及各设备的作用,因水平有限,整理的有些乱,笔记如下: 密封油系统启动时,油从哪来?(学习笔记一) 密封油四路备用油源,油从哪来?(学习笔记二) 密封油氢侧油循环 ...

  • Java学习笔记(四):理解接口 事件监听器

    一.接口 父类和子类比较,父类是一个比子类更抽象的类.这个抽象体现在两个方面:一是父类的属性和方法比子类的少:二是,子类的方法比父类的方法更加具体. 当父类非常抽象时,或者我们仅仅知道这个类的对象应该 ...

  • 《吴门验方》学习笔记——四加麻黄附子细辛汤

    ​四加麻黄附子细辛汤(原仲景方) 1.组成: 麻黄9g.制附子6g .细  辛3g 黄芩6g.独  活6g .黄  芪15g 温服,一服小汗,二服大汗. [此方为三黄汤原方,其条文下加减药--&quo ...

  • IOS之学习笔记四(类的实现和对象和id)

    IOS之学习笔记四(类的实现和对象和id)