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的方式

Orleans[NET Core 3.1] 学习笔记(四)( 1 )创建项目的更多相关文章

  1. Orleans[NET Core 3.1] 学习笔记(四)( 3 )监控Orleans Silo的方式 OrleansDashboard

    简介 Orleans用起来的确很爽,更爽的是咱们有能监控它的工具. OrleansDashboard 这个工具是一个可视化的Silo监控工具,Silo和Grain的活跃状态一目了然,各个接口的响应速度 ...

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

    简介 在这一节,我们将介绍如何在Silo和Client中获取Grain及调用Grain Grain获取方式 从Grain内部获取: //根据特定的Key值创建或获取指定的Grain IStudent ...

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

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

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

    前言 Orleans是一个跨平台的框架,用于搭建可扩展的分布式应用程序 第一次接触Orleans还是两年前做游戏服务器的时候,用SignalR+Orleans的组合,写起代码来不要太爽. 即将进入20 ...

  5. Orleans[NET Core 3.1] 学习笔记(三)( 2 )客户端配置

    客户端配置 通过一个ClientBuilder和多个补充选项类,以编程方式配置一个用于连接Silo集群并将请求发送至Grain的客户端. 客户端配置示例: var client = new Clien ...

  6. Orleans[NET Core 3.1] 学习笔记(三)( 1 )本地开发配置

    本地开发配置 本地开发和调试的时候,我们可能不需要去关注集群和网络ip端口.所以对于本地开发模式,Orleans给了我们比较简单的配置方式. Silo配置 在本地开发的配置模式下,Orleans会默认 ...

  7. Orleans[NET Core 3.1] 学习笔记(二)Hello World

    项目结构 开始Orleans之前,我们都知道Orleans主要可以分为俩部分,Host和Client. 所以我们可以创建如下的项目结构: IGrain 一个包含Grain接口的库(.NET Stand ...

  8. Android 学习笔记四:创建工具栏按钮

    原文:http://blog.csdn.net/lihongxun945/article/details/48951199 前面我们已经可以在一个Activity中添加一些按钮之类的组件.由于手机的屏 ...

  9. ASP.NET Core MVC 网站学习笔记

    ASP.NET Core MVC 网站学习笔记 魏刘宏 2020 年 2 月 17 日 最近因为” 新冠” 疫情在家办公,学习了 ASP.NET Core MVC 网站的一些知识,记录如下. 一.新建 ...

随机推荐

  1. Docker从入门到实践(1)

    一.Docker简介 1.1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多 ...

  2. linux 如何把一个装好的系统做成镜像(文件备份)

    linux 如何把一个装好的系统做成镜像(文件备份)  我来答 浏览 11851 次来自电脑网络类芝麻团 2016-01-19 案例1(命令式操作) 像'ghost'那些备份系统,系统出了问题就恢复 ...

  3. [Odoo12基础教程]之win10中odoo12环境搭建

    所需材料 1.python3.7 2.pycharm社区版及以上 3.postgresSQL10 下载链接:https://www.enterprisedb.com/thank-you-downloa ...

  4. SpringAOP之使用切入点创建通知

    之前已经说过了SpringAOP中的几种通知类型以及如何创建简单的通知见地址 一.什么是切入点 通过之前的例子中,我们可以创建ProxyFactory的方式来创建通知,然后获取目标类中的方法.通过不同 ...

  5. SpringMVC 前端传递list到后台

    ---恢复内容开始--- 1.前端获取传入后台的list 2.ajax写法: $.ajax({ type: 'post', url: url, async:false, dataType:" ...

  6. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(2)- Boot配置(ISP_Pin, OTP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRTx ...

  7. Java 虚拟机结构

    一 数据类型 与 Java 程序语言中的数据类型相似,Java 虚拟机可以操作的数据类型可分为两类:原始类型(Primitive Types,也经常翻译为原生类型或者基本类型)和引用类型(Refere ...

  8. 【Android - 问题解决】之ScrollView嵌套ListView时总是自动滑动到ListView顶部的问题

    最近做了一个项目,里面有一个ScrollView嵌套ListView的布局. 做出来之后发现,进入这个界面之后,总是自动滑动到ListView的顶部,而ScrollView中位于ListView上面的 ...

  9. 获取Zabbix 中资源的使用率

    import pymysql as MySQLdb import time import datetime import xlsxwriter # zabbix数据库信息: zdbhost = 'xx ...

  10. C语言博客作业11

    一.本周教学内容&目标 第5章 函数 要求学生掌握各种类型函数的定义.调用和申明,熟悉变量的作用域.生存周期和存储类型. 二.本周作业头 这个作业属于那个课程 C语言程序设计II 这个作业要求 ...