Orleans入门例子
Orleans入门例子
这是Orleans系列文章中的一篇.首篇文章在此
一.铺垫。
虽然是个入门例子,还是需要一些铺垫。
Orleans的最小完全体,应该分为2个部分。一个是Orleans客户端,一个是Orleans服务端,这里为什么要加上“Orleans”这个限定词语呢?那是因为Orleans的完全体,才是普通意义上的服务端主程。它们共同构成了游戏服务器,网站服务器等等。
在Orleans客户端中,我们使用GrainClient类以及Grain类,在Orleans服务端内,我们主要使用silo类和grain类。这里要说说Silo类,前面说过Grain类是处于“单线程机制”约束下的类,那么它们运行在哪个地方呢?就是Silo类所在的地方。Silo类是Grain地代码实际执行的地方,它是Grain类的宿主,它承载着所有的Grain实例,也许是几百万个Grain实例。在一些语境下,silo,silohost,以及Orleans服务端,这三个词语有可能代表同一个意思.
一个外部请求的处理大部分情况下需要很多个Grain实例,进行一连串的方法调用后才能处理完毕,这些Grain实例形成一个处理消息的链条,这个消息流走于Grain链内直至处理完毕。那么这个消息是如何第一次到达Grain链条里呢?GrainClient类的作用就是入口,它通知Silo类,有新消息达到,它需要哪个Grain类实例,需要调用特定的方法等。
经过以上铺垫,要想创造一个Orleans完全体,我来用vs2017创建一个解决方案,里面添加4个项目:Client,Host,Grains,IGrains。它们的作用分别解释如下:
- Client:这个显而易见,里面就是要运行GrainClient的。它要和Host通信,这就要求它引用IGrains项目。这是个控制台项目
- Host:这个也是显而易见,里面就是要运行Silo的。它应该引用Grains项目以及IGrains项目,因为它要承载Grain(这就要求引用Grains类),并且需要Grain实例间的通信(这就要求引用IGrains项目),这是个控制台项目
- Grains:这个里面实现所有IGrain载明的接口,实现所有的Grain类,包括它们的方法以及字段。(它要求引用IGrain。。。废话)这是个类库项目
- IGrains:这里放置所有Grains类要扩展的接口。这是个类库项目。
同时为了使用Orleans框架,我们还需要引用Orleans的类库,官方教程里有方案,不过,我们采用简单的办法,统一引用一个类库集合,下文有述。
好吧,以上解释不管懂与不懂,你就暂且记下,先按照步骤一步一步来吧。也许某个阶段,你就突然懂了。我相信在读的各位对这种醍醐灌顶的感觉一定不陌生。
按照以上套路,我开始了我的工作,我打算跟世界say Hi:
二.创建
我创建了四个项目的解决方案,它长成这个样子,注意它们的.net框架版本都是4.6.1:

好了我们要引用Orleans类库啦,说了半天,终于要主角登场啦,好激动,所以我nuget引用了Microsoft.Orleans.Server,它长这样子:

里面没有实际内容,我现在先弄IGrains,它很简单,就一个接口一个方法:长成这样:

我再弄Grains项目:它就是要实现IGrains项目里的接口,所以先引用哪个项目,然后实现它,长这样子。

我再实现Client项目,它需要引用IGrains项目,它长这样子:

最后是Host类,它长这样子:

现在我高兴的运行这个Orleans完全体,它再一连串的日志记录之后,跳出了 hello world如下图

…我成功地创造了Orleans地完全体。好了全系列文章到此结束。
再见

补充
噢,我还需要补充一下下。
搞了半天,闹这么大动静,就写了个简版的WCF?并不是,这里只是展示了码Orleans的主要步骤。这里有几个要点需要解释一下:
| 1.IGrains的所有接口方法,必须是返回Task类的。这个是必须的,因为Orleans的“单线程机制”,是建立在Task类之上的。它是利用TaskScheduler类,实现“单线程机制”的。啥?有人问怎么实现的?你确信自己入门教程还没有看完就想知道?…以后再说吧。反正接口的方法,必须是返回Task。 |
|
2.IGrains接口扩展自IGrainWithInteger接口,这个IGrainWithInteger接口是Orleans提供的,之前说过,Grain实例之间需要通信,这就需要彼此区分,要有各自的主标识。这个接口,就规定了主标识是长整数(名字是整数,但是实际上是长整数)。Grain实例的主标识还可以是其他类型:比如字符串和Guid等等。 |
| 3.Grains项目中,实现了我规定的接口,就表明自己的主标识是长整数,它又扩展自Grain类,就表明自己受“单线程机制”约束了 |
| 4.Host项目,只是引用了Grains项目,但是没有再代码中具体使用。它如何知道自己要承载哪些Grain类?Host利用反射检查所有目录里的类库文件,如果找到grain类,它就加载,并管理起来 |
| 5.GrainClient有静态的,有动态的类,我这里先使用静态类讲解。动态类其实一样。我调用的时候,使用一个参数“12345”。就是要告诉Host。我要激活主标识是12345的Grain类实例。然后又调用了它的say方法。它聪明的再host的控制台窗口打印出say hello。 |
到现在,我们就明白了,再Orleans的世界里,给grain发送消息,实质上是调用对应的接口,grain实例接收到消息以后,使用对应的方法进行处理。(吃瓜群众:这不就是一个RPC框架嘛…呵呵。)
在这个简单的例子里,展现出的东西还有很多,不过今天很晚了,打完收工。明天继续说说这个例子展现的内容。
Orleans入门例子的更多相关文章
- Orleans 初接触(一) 入门例子
[返回导航] 在简单了解了Orleans 之后我们可以通过几个例子去加深印象 一.Orleans入门例子 这个例子是跟着<Orleans入门例子>(https://www.cnblogs. ...
- 【Bootstrap Demo】入门例子创建
本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快 ...
- 【Bootstrap】入门例子创建
本文简单介绍下如何来使用 Bootstrap,通过引入 Bootstrap,来实现一个最基本的入门例子. 在前一篇博文[Bootstrap]1.初识Bootstrap 基础之上,我们完全可以更加方便快 ...
- spring boot入门例子
最近学习spring boot,总结一下入门的的基础知识 1新建maven项目,修改pom.xml <project xmlns="http://maven.apache.org/PO ...
- MINA经典入门例子----Time Server
原文地址 http://blog.sina.com.cn/s/blog_720bdf0501010b8r.html 貌似java的IO.NIO的入门例子都有相关的Time Server Demo.本例 ...
- 一个简单的iBatis入门例子
一个简单的iBatis入门例子,用ORACLE和Java测试 目录结构: 1.导入iBatis和oracle驱动. 2.创建类Person.java package com.ibeats;import ...
- JPA入门例子(采用JPA的hibernate实现版本) 转
JPA入门例子(采用JPA的hibernate实现版本) jpahibernate数据库jdbcjava框架(1).JPA介绍: JPA全称为Java Persistence API ,Java持久化 ...
- Cassandra 单机入门例子——有索引
入门例子: http://wiki.apache.org/cassandra/GettingStarted 添加环境变量并source生效,使得可以在任意位置执行cassandra/bin安装目录下的 ...
- Quartz入门例子简介 从入门到菜鸟(一)
转: Quartz入门例子简介 从入门到菜鸟(一) 2016年11月19日 22:58:24 爱种鱼的猫 阅读数:4039 刚接触quartz这个词并不是在学习过程中...而是WOW里面的界面插件 ...
随机推荐
- tp路由+伪静态+去掉index.php
浏览:10536 发布日期:2013/10/08 分类:技术分享 关键字: 路由 伪静态 去掉index.php 之前一个网友说能不能达到这样的效果,www.olcms.com/news/id.htm ...
- ubuntu-apache下隐藏thinkphp入口文件index.php
按照thinkphp手册中来讲,apache服务器下,隐藏thinkphp入口文件有3步: httpd.conf配置文件中加载了mod_rewrite.so模块 AllowOverride None ...
- NSDateFormatter相关整理
//实例化一个NSDateFormatter对象NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; //设定时间格式,这里可 ...
- wamp版本升级小问题记录
在升级wamp版本时遇到的一些小问题,特此记录 在安装完成之后,修改了Apache根目录,可以正常访问.但是发现 httpd-vhosts.conf追加配置的无法访问,逐步检查,有以下问题 1.Inc ...
- JavaScript之点赞特效
在很多网站中登录后可以对你说喜欢的文章.图片之类的进行点赞,这个功能效果的实现就是我今天要写的东西.代码不长,但觉得还是很有用的,为 js 给用户交互体验上更加友好.在实现过程中,主要的思路有: 点赞 ...
- 译-BSA NSH Command介绍
BSA NSH Command全称BMC BladeLogic Network Shell Command,是基于ZSH的shell. 1 说明 NSH命令行(全称Network Shell,又称为 ...
- Linux指令--文件和目录属性
对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...
- 使用keepAlive对上下拉刷新列表数据 和 滚动位置细节处理 - vue
[前言] 使用vue处理项目中遇到列表页面时,之前项目中总会有一些细节问题处理得不太好,这里总结一下,以便优化以后的代码.如下: 1. 使用mint-ui中的LoadMore组件上下拉刷新时,有时无法 ...
- Zabbix-3.2.4实现微信(WeChat)告警
摘自abcdocker网站 原文地址:https://www.abcdocker.com/abcdocker/2472 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式, ...
- 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等
1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...