项目结构

开始Orleans之前,我们都知道Orleans主要可以分为俩部分,Host和Client。

所以我们可以创建如下的项目结构:



IGrain 一个包含Grain接口的库(.NET Standard 2.1)

Grain 一个包含Grain类的库(.NET Standard 2.1)

Host 一个控制台应用程序,用来托管我们的Silo(.NET Core 3.1)

Client 一个控制台应用程序,用来做我们的Orleans客户端(.NET Core 3.1)

Orleans引用

NuGet咋用不用我再赘述了吧。

IGrain

Microsoft.Orleans.Core.Abstractions(3.0.1)
Microsoft.Orleans.CodeGenerator.MSBuild(3.0.1)

Grain

Microsoft.Orleans.Core.Abstractions(3.0.1)
Microsoft.Orleans.CodeGenerator.MSBuild(3.0.1)
Microsoft.Extensions.Logging.Abstractions(3.1.0)//用于日志记录

Host

Microsoft.Orleans.Server(3.0.1)
Microsoft.Extensions.Logging.Console(3.1.0)//用于控制台信息打印

Client

Microsoft.Orleans.Client(3.0.1)
Microsoft.Extensions.Logging.Console(3.1.0)//用于控制台信息打印

定义Grain接口

在IGrain项目中,添加一个IHello.cs代码文件,并在其中定义以下IHello接口:

using IGrain;
using Microsoft.Extensions.Logging;
using System.Threading.Tasks; namespace Grain
{
public class HelloGrain : Orleans.Grain, IHello
{
private readonly ILogger logger; public HelloGrain(ILogger<HelloGrain> logger)
{
this.logger = logger;
} Task<string> IHello.SayHello(string greeting)
{
logger.LogInformation($"\n 收到SayHello消息: greeting = '{greeting}'");
return Task.FromResult($"\n Client said: '{greeting}', so HelloGrain says: Hello!");
}
}
}

创建Silo

在这一步,我们修改Host的Program.cs以初始化托管和运行我们的Grain服务器-Silo。在这里我们用代码来控制群集和连接,实际应用的配置可以在Orleans文档的“ 本地开发配置”页面中找到更多的信息。现在的例子只是运行具有单个Silo的集群。

using Grain;
using Orleans;
using Orleans.Configuration;
using Orleans.Hosting;
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging; namespace Host
{
class Program
{
static int Main(string[] args)
{
Console.WriteLine("Hello World!");
return RunMainAsync().Result;
} private static async Task<int> RunMainAsync()
{
try
{
var host = await StartSilo();
Console.WriteLine("\n\n 按回车键停止 \n\n");
Console.ReadLine(); await host.StopAsync(); return 0;
}
catch(Exception ex)
{
Console.WriteLine(ex);
return 1;
}
} private static async Task<ISiloHost> StartSilo()
{
//定义群集配置
var builder = new SiloHostBuilder()
.UseLocalhostClustering()//配置Silo只使用开发集群,并监听本地主机
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";//获取或设置群集标识。这在Orleans 2.0名称之前曾被称为DeploymentId。
options.ServiceId = "OrleansBasics";//获取或设置此服务的唯一标识符,该标识符应在部署和重新部署后继续存在,其中Orleans.Configuration.ClusterOptions.ClusterId可能不存在。
})
.ConfigureApplicationParts(parts => parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences())
.ConfigureLogging(logging => logging.AddConsole()); var host = builder.Build();//运行给定的配置来初始化主机。只能调用一次。
await host.StartAsync();//启动当前Silo.
return host;
}
}
}

创建客户端

最后,我们需要配置一个客户端与Grain进行通信,将其连接到集群(其中有一个Silo),然后调用Grain。注意,群集配置必须与我们用于Silo的配置匹配。在Orleans文档的“ 群集和客户端”中有关于客户端的更多配置信息

using IGrain;
using Microsoft.Extensions.Logging;
using Orleans;
using Orleans.Configuration;
using System;
using System.Threading.Tasks; namespace Client
{
class Program
{
static int Main(string[] args)
{
Console.WriteLine("Hello World!");
return RunMainAsync().Result;
} private static async Task<int> RunMainAsync()
{
try
{
using(var client = await ConnectClient())
{
await DoClientWork(client);
Console.ReadKey();
}
return 0;
}
catch(Exception ex)
{
Console.WriteLine($"\n尝试运行客户端时发生异常: {ex.Message}");
Console.WriteLine("请确保客户端尝试连接的 Silo Host 正在运行。");
Console.WriteLine("\n按任意键退出。");
Console.ReadKey();
return 1;
}
} private static async Task<IClusterClient> ConnectClient()
{
IClusterClient client;
client = new ClientBuilder()
.UseLocalhostClustering()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "dev";
options.ServiceId = "OrleansBasics";
})
.ConfigureLogging(logging => logging.AddConsole())
.Build(); await client.Connect();
Console.WriteLine("客户端已成功连接到Silo Host \n");
return client;
} private static async Task DoClientWork(IClusterClient client)
{
//从客户端调用Grain的示例
var friend = client.GetGrain<IHello>(0);
var response = await friend.SayHello("Good morning, HelloGrain!");
Console.WriteLine("\n\n{0}\n\n", response);
} }
}

运行应用程序

Host

Client

本文代码范例

GitHub仓库

便捷路由

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

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

Orleans[NET Core 3.1] 学习笔记(二)Hello World的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 一起学ASP.NET Core 2.0学习笔记(二): ef core2.0 及mysql provider 、Fluent API相关配置及迁移

    不得不说微软的技术迭代还是很快的,上了微软的船就得跟着她走下去,前文一起学ASP.NET Core 2.0学习笔记(一): CentOS下 .net core2 sdk nginx.superviso ...

  9. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

随机推荐

  1. PHP 富文本解码为 HTML 并显示

    PHP 富文本解码为 HTML 并显示 使用  html_entity_decode 函数 参考文档 PHP实例: // html_entity_decode(待解码内容, 如何处理引号) html_ ...

  2. 关于log4j

    搭建完maven+SpringMVC以后,我们还需要添加日志功能,方便记录应用在应用中产生的日志信息. 1.添加依赖包:依赖中除了对slf4j依赖外还有对邮件插件的依赖.当遇到报错的时候可以发送邮件到 ...

  3. keypress 和 blur 事件冲突的问题

    需求:点击需求:点击添加标签,出来input框,内容输入完成后点击enter键和blur时都可以执行提交标签的效果,提交时对内容进行判断,执行完成后清除input内的内容.如下图 问题:内容输入完成后 ...

  4. elementui分页记录,reserve-selection

    第一步:在<el-table></el-table>标签中加上 :row-key="getRowKeys" 第二步:在<el-table-column ...

  5. 微服务中的Kafka与Micronaut

    今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务.我们使用Micronaut框架,它为与Kafka集成提供专门的库.让我们简要介绍一下示例系统的体系结构.我们有四个微型服务:订 ...

  6. MYSQLnavicat绿色版工具下载

    MYSql远程连接工具navicat工具:https://pan.baidu.com/s/1RU_8FCX7yCseAFRhn4voAQ

  7. Fortran流程控制与逻辑运算、循环--xdd

    1.IF语句 1 if() then ... end if 2 if() then ... else ... end if 3 if() then ... else if() then ... els ...

  8. day 30 多线程 socketserver模块补充

    内容回顾: socket 模块 服务端:收发数据 - > accept/recv 客户端:收发数据 -> connect/recv 1. 考试题 1. 解释性和编译型 编译型: 先把代码编 ...

  9. ip地址计算

    1.多少个子网? 2x个,其中x为被遮盖(取值为1)的位数.例如,在11000000(这个值是子网掩码的最后几位,例如,mask=18)中,取值为1的位数为2,因此子网数位22=4个: 2.每个子网包 ...

  10. Java面向基础概述和三大特性

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...