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里面的界面插件 ...
随机推荐
- Java的语言特点详解
1)简单性:java从C++简化而来,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的.java还剔除了C++操作符过载和指针操作. 2)面向对象:java是一个面向对象的语 ...
- 平安E行销扫脸打卡/人寿国寿e店云参会钉钉考勤,原来这么轻易被破解!
由于近几年人们的保险意识越来越强,身边有很多朋友都在中国人寿,中国平安等保险公司上班薪水高,工作自由,又可以学习很多保险理财的知识,每天早会个2~3个小时,剩下的基本都是自己的时间,(vx:99508 ...
- $.extend()方法和(function($){...})(jQuery)详解
1. JS中substring与substr的区别 之前在项目中用到substring方法,因为C#中也有字符串的截取方法Substring方法,当时也没有多想就误以为这两种方法的使用时一样的. ...
- 从零开始学习前端开发 — 1、HTML基础
一.web标准 web标准-网页制作的标准,它是由一系列标准组成的,主要包含三个方面:结构(html,xhtml),表现(css),行为(javascript) 注:结构和表现的标准由w3c(万维网联 ...
- TP5使用phpmailer实现邮件发送
1.从github下载PHPMailer,在vendor目录中新建文件夹phpmailer,将压缩包中的class.phpmailer.php和class.smtp.php复制到phpmailer中, ...
- github中删除项目
- Codeforces 448 E. Divisors (DFS,储存结构)
题目链接:E. Divisors 题意: 给出一个X,f(X)是X所有约数的数列(例6:1 2 3 6),给出一个k,k是递归的次数(例:k=2 : f(f(X)) ; X=4,k=2: 1 1 2 ...
- Codeforces 448 D. Multiplication Table 二分
题目链接:D. Multiplication Table 题意: 给出N×M的乘法矩阵要你求在这个惩罚矩阵中第k个小的元素(1 ≤ n, m ≤ 5·10^5; 1 ≤ k ≤ n·m). 题解: n ...
- J.U.C FutureTask之源码解析
通过直接继承Thread, 实现Runnable接口来创建线程.但这两种方式都有一种缺陷:在执行完任务之后无法获得执行结果. 如果需要获得执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果, ...
- 【笔记】vue-cli 开发环境中跨域连接后台api(vue-resource 跨域post 请求)
在vue-cli 项目中很多人会用到mock 数据(模拟数据),但是我觉得如果在真实的数据库交互中开发会更有安全感一些,所以查了一下百度很多人推荐的就是: 跨域! 跨域是什么概念?不同的主机名,同主机 ...