项目结构

开始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. centos7 openssh 7.9.1 升级

    由于项目构建时间比较长,近期安全检查发现openssh有漏洞.所以要升级openssh到7.9p1版本.由于ssh用于远程连接,所以要谨慎操作. 1. 依赖安装 OpenSSL版本:目前OpenSSH ...

  2. thinkphp 获取前端传递过来的参数

    thinkphp 获取前端传递过来的参数 use think\facade\Request; // 获取当前请求的name变量 Request::param('name'); // 获取当前请求的所有 ...

  3. 修改 processor.php 文件,监听用户对该应用的消息

    修改 processor.php 文件,监听用户对该应用的消息 class cgc_fdModuleProcessor extends WeModuleProcessor { public funct ...

  4. requests模块使用代理

    1.创建try_proxies.py文件import requestsproxies = {"http":"http:117.135.34.6:8060"}he ...

  5. ubuntukylin16.04LTS(乌班图麒麟版长期支持版,并非银河麒麟)安装体验

    最近,国产银河麒麟版在政府部门推广使用.我有幸接触了,感觉还是不错的.这次政府软件正版化整改中,也列入了windows和银河麒麟的选项.我想试安装一下,可是没找到.就近找了它的类似系统ubuntuky ...

  6. js 关于apply和call的理解使用

    关于call和apply,以前也思考良久,很多时候都以为记住了,但是,我太难了.今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 一.apply函数定义与理解 ...

  7. salesforce lightning零基础学习(十五) 公用组件之 获取表字段的Picklist(多语言)

    此篇参考:salesforce 零基础学习(六十二)获取sObject中类型为Picklist的field values(含record type) 我们在lightning中在前台会经常碰到获取pi ...

  8. cenos7搭建gitlab

    git.github和gitlab的区别 git:是一种版本控制系统,是一个命令,是一种工具 gitlib:是基于实现功能的开发库 github:是一个基于git实现的在线代码仓库软件 gitlib可 ...

  9. linux工作调度(计划任务)

    linux工作调度有两种:at,cron · at:at是一个可以处理仅执行一次就结束调度的命令.说白了就是在某个时间需要干某一件事,例如在2018年10月12日下午一点要执行一个数据库矫正脚本. · ...

  10. 快速入门函数式编程——以Javascript为例

    函数式编程是在不改变状态和数据的情况下使用表达式和函数来编写程序的一种编程范式.通过遵守这种范式,我们能够编写更清晰易懂.更能抵御bug的代码.这是通过避免使用流控制语句(for.while.brea ...