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里面的界面插件 ...
随机推荐
- UE4 内容示例网络同步Learn
一, 1.1 Actor的复制 Actor中的Replicates ,为true时,服务器会把该Actor同步,显示在客户端中. 1.2 Switch Has Authority判断是客户端还是服务器 ...
- php 类的相互访问
========================================================================================== // public ...
- iOS开发中一些有用的小代码
1.判断邮箱格式是否正确的代码: //利用正则表达式验证 -(BOOL)isValidateEmail:(NSString *)email { NSString *emailRegex = @&q ...
- 详解Office 外接程序 COM Add In的LoadBehavior及其妙用
Office的所有COM Add In,包括用Shared Add In模板和VSTO Add In模板创建的,都会在注表里面存储一些信息.对于当前用户安装的Add In,以Excel为例,对应的注册 ...
- LINUX文件操作命令
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- linkin大话数据结构--List
List:Collection子接口 List是有序的集合,集合中每个元素都有对应的顺序序列.List集合可使用重复元素,可以通过索引来访问指定位置的集合元素(顺序索引从0开始),List集合默认按元 ...
- JAVA中生成、解析二维码图片的方法
JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...
- MySQL中group_concat()函数的排序方法
group_concat()函数的参数是可以直接使用order by排序的.666..下面通过例子来说明,首先看下面的t1表. 比如,我们要查看每个人的多个分数,将该人对应的多个分数显示在一起,分数要 ...
- GDB 的使用
gdb使用: 1.编译时必须加-g选项,生成调试需要的信息.如 g++ xxx.cpp -o xxx -g 2.调试最好结合core文件 3.调试命令:gdb xxx x ...
- Storm容错和高可用
Daemon Fault Tolerance Storm有一些不同的守护进程 Nimbus负责调度workers supervisors负责运行和杀死workers log views负责访问日志 U ...