项目结构

开始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. nyoj 263-精 挑 细 选 (sort(P, P+m, cmp); bool cmp(node a, node b)...)

    263-精 挑 细 选 内存限制:64MB 时间限制:3000ms 特判: No 通过数:14 提交数:26 难度:1 题目描述: 小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根 ...

  2. nyoj 103-A+B Problem II (python 大数相加)

    103-A+B Problem II 内存限制:64MB 时间限制:3000ms 特判: No 通过数:10 提交数:45 难度:3 题目描述: I have a very simple proble ...

  3. React入门知识点清单

    做前端的一定都知道现在是三大框架--Vue.React.Angular三足鼎立的时代.Vue是公认的最容易入门的,因为它文件结构上有传统的HTML的影子,让刚接触它的前端人员刚到很"亲切&q ...

  4. django_2:模板

    使用模板变量: 在html文件中,{{title}}即为模板变量, 在view.py文件中,render函数,增加第三个参数,以字典形式给值. def index(req): return rende ...

  5. Win32窗口消息机制 x Android消息机制 x 异步执行

    如果你开发过Win32窗口程序,那么当你看到android代码到处都有的mHandler.sendEmptyMessage和 private final Handler mHandler = new ...

  6. 1 数据 & 图表

    瞎逼逼:虽然是统计专业,但学艺不精.大学受过的专业训练很少,妥妥学渣.因此工作后决定重新复习,阅读材料为贾俊平的<统计学>第7版.每周更新. 我不按照书里的逻辑顺序和所有知识点来写我的笔记 ...

  7. vim的查找功能

    vim是一款强大的编辑器. 在vim下要查找字符串: 一,全匹配: 1,从上往下查找,比如“string” :   /string 2,从下往上查找,比如“string” : ?string 二,模糊 ...

  8. 【原】android【手机】屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法。

    1.先说要怎么做,后面在慢慢讲解: 2.现在来讲解为什么要放这三套: 这三套其实按内容来说就两种,为什么这两种可以适配hdpi,xhdpi,xxhdpi呢? 那么两种类型的dimens就可以了,为什么 ...

  9. java8 Optional优雅非空判断

    java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...

  10. Selenium+Java(四)Selenium Xpath元素定位

    前言 关于Selenium元素定位,这是最后一篇博客. Xpath定位可以实现的功能 Selenium+Java(三)Selenium元素定位中讲的定位方式也可以实现,具体要用那种定位方式要根据自己的 ...