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里面的界面插件 ...
随机推荐
- [UWP]使用Acrylic
1. 前言 在 如何使用Fluent Design System 这篇文章里已经简单介绍过Reveal的用法,这篇再详细介绍其它内容. 自Windows 8 放弃Aero后,群众对毛玻璃回归的呼声一致 ...
- 二维数组模拟实现酒店管理系统-java
业务分析 1.需要一个房间类,包含房间的属性,比如房间编号.房间类型.是否占用. 2.需要一个旅馆类,旅馆有房间,提供的方法需要有 预订房间.打印房间信息.初始化房间.退房. 3.测试类,测试预订房间 ...
- Yourphp 使用说明
https://wenku.baidu.com/view/c8d2e667cc1755270722088a.html 这个是站点的配置信息,比如:网站名称. LOGO .网站标题等 推荐位:个别可能用 ...
- geotools实现多边形的合并&缓冲区
这算是第一次接触开源工具包,说实话刚开始有点不知所措,中途遇到很多问题的时候也感觉头皮发麻,不过很高兴自己还是坚持下来了. geotools就不做过多的介绍了,想总结一下如何根据开源内容做自己的项目. ...
- ios7对于NSString对象进行了的变更
1.instancetype替代id来做返回值的类型.
- Ubuntu16.04安装mongodb
Ubuntu16.04安装mongodb copy from: http://blog.csdn.net/zhushh/article/details/52451441 1.导入软件源的公钥 sudo ...
- 监控服务器ssh登录,并发送报警邮件
最近想监控下云主机的ssh登录情况,所以开始写ssh登录报警监控.实现方式并不难. 一:邮箱申请开启SMTP 在邮箱中选择“设置”----->“账户” 在如下图处开启POP3/SMTP服务,并生 ...
- Do you know how many stuff inside your Google Account?
My friend Sandy she wants me to do her a favor. She'd like to clear Hangouts chat history. I think s ...
- g4e基础篇#6 了解Git历史记录
章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git 分布式版本控制系统的优势 Git 安装和设置 了解Git存储库(Repo) 起步 1 – 创建分支和保存代码 起步 2 – 了解Git ...
- hdevelop (halcon)处理大分辨率图像问题
HALCON 的ide有2种模式:hdevelop 和hdevelop xl hdevelop 适用于普通分辨率的图像,小于等于 32k x 32k : hdevelop xl适用于大分辨率的图像,大 ...