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里面的界面插件 ...
随机推荐
- js获取不带单位的像素值
所谓获取不带单位的像素值就是获取比如元素的宽度.高度.字体大小.外边距.内边距等值但是去掉像素单位. 比如:某一个元素的宽度是100px,现在我要获取这个这个值但是不带单位“px”,对于这种问题你会怎 ...
- 从零开始学习前端开发 — 16、CSS3圆角与阴影
一.css3圆角: border-radius:数值+单位; 1.设置一个值:border-radius:20px; 四个方向圆角都为20px(水平半径和垂直半径相等) 2.设置两个值 border- ...
- 织梦CMS提示DedeTag Engine Create File False错误的解决办法总结
今天帮客户升级站点,遇到了一个老问题,生成栏目的时候提示"DedeTag Engine Create File False",突然发觉这个问题竟然在以前做站的时候困扰过我多次,于是 ...
- WIN2016安装织梦没写入权限怎么办听语音
配置好了WINSERVER2016环境,一切看起来都弄得差不多了,可是安装织梦的时候提示我没有写入权限,不能继续安装,于是我很郁闷,开始寻求解决办法. 工具/原料 WINSERVER2016 织梦5. ...
- thinkphp开发微信公众号时,验证基本配置提示请求url超时
原因在index.php入口文件中必须有define('APP_NAME', 'Weixin'); 服务器url:http://bxu2713700584.my3w.com/Weixin/Index/ ...
- DedeCMS实现自定义表单提交后发送指定QQ邮箱法
https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_3_dg&wd=dedecms 邮箱&oq=d ...
- Python3 的元组
元组(tuple):戴上了枷锁的列表 元组与列表非常相似但是元组内元素的类型相同,且元组内的元素不能修改 1.创建元组的方法 与列表不同创建元组大部分情况下是用小括号,例如 tuple1=(1,2,3 ...
- VUE之ECMAScript6(es6)
es6:es:EMCAScript 6 (es2015)Emca:国际标准组织 1.常量和变量 const a = "hello" let:定义一个块级作用域的变量 需要先定义再使 ...
- 月薪20k以上的高级程序员需要学习哪些技术呢?
课程内容: 源码分析.分布式架构.微服务架构.性能优化.团队协作效率.双十一项目实战 适用对象: 1-5年或更长软件开发经验,没有工作经验但基础非常扎实,对java工作机制,常用设计思想,常用java ...
- 常用SQL笔记总结
DDL(data definition language)创建和管理表 1.创建表 1.直接创建 例如: create table emp( name varchar(20), salary int ...