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. mysql提示Packet for query is too large (1142 > 1024)解决方案

    注:最近mysql一直提示如下错误 Packet for query is too large (1185 > 1024). You can change this value on the s ...

  2. runlevel init

    init概念存在于cnetos7以下,配置文件/etc/inittab init 以及 文本和图形界面切换(可以用ctrl+alt+n 或者 init3 5切换,不是重启切) 命令init N 0 关 ...

  3. Microsoft Dynamics CRM 批量上传web资源(非官方WebResourceUtility)并替换实体图标

    背景: 去年以前可以按照目录WebResourceUtility批量上传web资源,昨天发现用不了了,拿到WebResourceUtility源码改了一下都不是很方便,感觉官方写的太冗余,太长了,跟我 ...

  4. 20190926-2 选题 Scrum立会报告+燃尽图05

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8678 一.小组情况组长:迟俊文组员:宋晓丽 梁梦瑶 韩昊 刘信鹏队名:扛 ...

  5. Hadoop运行模式

    Hadoop运行模式 (1)本地模式(默认模式): 不需要启用单独进程,直接可以运行,测试和开发时使用. 即在一台机器上进行操作,仅为单机版. 本地运行Hadoop官方MapReduce案例 操作命令 ...

  6. JavaScript笔记五

    1.条件分支语句 - switch语句 - 语法: switch(条件表达式){ case 表达式: 语句... break; case 表达式: 语句... break; case 表达式: 语句. ...

  7. linuxLVM之LV扩大和缩小容量(非xfs文件系统)

    LVM的基础请见:https://www.cnblogs.com/wxxjianchi/p/9698089.html 一.放大LV的容量.放大容量是由内而外来操作的. 1.设置新的lvm分区:用fdi ...

  8. NSSearchPathForDirectoriesInDomains用法

    iPhone会为每一个应用程序生成一个私有目录,这个目录位于: /Users/sundfsun2009/Library/Application Support/iPhone Simulator/Use ...

  9. java8 按两个属性分组,并返回扁平List; stream排序

    --------------- java8 按两个属性分组,并返回扁平List /** * 设置大区小区分组排序 * @param dtoList */ private List<Perform ...

  10. TensorFlow学习笔记——LeNet-5(训练自己的数据集)

    在之前的TensorFlow学习笔记——图像识别与卷积神经网络(链接:请点击我)中了解了一下经典的卷积神经网络模型LeNet模型.那其实之前学习了别人的代码实现了LeNet网络对MNIST数据集的训练 ...