Orleans简单配置

这是Orleans系列文章中的一篇.首篇文章在此

话说曾几何时,我第一次看到xml文件,心中闪过一念想:"这<>是什么鬼?"…用ini或者json多简单易懂,现在发觉作为配置文件,json有赶超xml的趋势.不过xml用多了,也觉得顺眼多了.不觉得<>难看了,反而它能折叠让我觉得组织起来也更方便了.这说明一个道理:不是你上了大学,而是大学上了你.你觉得痛苦到方便的过程,就是这种转变的佐证.所以C++又名C艹.你们细细体会一下.

Orleans完全体,分为Orleans客户端以及Orleans服务端,所以配置也应对与这两方面.再Orleans源码里也可以看出来,如下截图:

其中cluster就是服务端配置,client就是客户端配置.说一说cluster,起个名字就叫cluster说明再实际应用中,单个siloHost不能满足Orleans小组的需求,可以听到Orleans君呐喊说:我天生就是为cluster的.瞬间觉得我举得栗子,单silo的例子是个low X.不过没事..微软还举了个例子,甚至把四个项目(client,host,接口,以及Grain实现)都放在了一个项目中.有空可以去看看.

确实,如果不是为了分布式,Orleans带来的好处就少了许多,单silo带来的好处就是,编写多线程程序的时候,逻辑变清晰了,出错少了.可以这么说,多线程要是没有锁,难度就减少了一大半了.但是分布式,分布式,分布式…就算是不需要锁,分布式一样很难.Orleans的出现让分布式的难度又降低了一大半.

基于编程的配置,在介绍完基于文件的配置之后,各位观众可以自己研究.vs中需要引入OrleansConfiguration.xsd文件才能更好的利用智能提示来配置.这个文件在Orleans源码中有.

客户端配置

客户端的配置非常简单,假设此文件名字叫做client.xml

<ClientConfiguration xmlns="urn:orleans">
<Gateway Address="192.168.1.1" Port="30000"/>
<Gateway Address="192.168.1.2" Port="30000"/>
<Gateway Address="192.168.1.3" Port="30000"/>
</ClientConfiguration>

使用它也很简单:如下图

这些Gateway显然对应着silo提供的端口和网址,通常来说这些关口配置一个就可以了.不过配置多个可以帮助提高稳定性(前提是silo存在).在1.5版本以及之后,Orleans提供了一个非静态的GrainClient类,名字是ClientBuilder.一个客户端可以有多个Client了..每个client可以有不同的 配置文件.选择一下子又多了起来.

以上的配置是基于silo的地址端口固定的情况,但是Orleans支持服务发现,特别是在基于集群的配置的时候.client甚至不知道silo的地址在哪,它只需要查询"服务发现"的服务.这个服务返回现在活着的silo的地址.client连接这些地址.基于集群的客户端配置是如下格式:

<ClientConfiguration xmlns="urn:orleans">
<SystemStore SystemStoreType="SqlServer"
DeploymentId="target deployment ID"
DataConnectionString="SQL connection string"/>
</ClientConfiguration>

这样可以使用sql server作为服务发现的服务.并不是随便的sql server都可以作为服务发现用的.在源代码中官方提供了一些sql脚本.通过这个sql脚本构建好数据库,就可以用来服务发现了.

用数据库作为服务发现是很好的选择,不过我没有采用它,我是基于以下考虑的:数据库还要作为数据持久化设备,还要作为event sourcing.还要钱…我采用了更为轻量化的方案.这个不是本文的重点.关于集群的配置方法我会在以后的文章中举个栗子.现在文章的目的是为了引入持久化.所以就暂时按住不表.且待我接着说存储的配置.好了客户端的基本配置就结束了.(构建集群的配置会再后边文章详细说说,这里先稍微引入一下)

说说重头戏,服务端配置,就像上边截图中列示的一样,服务端配置就是cluster的配置!!!哈哈,怕了吗?

为了测试和开发,可以如下配置本地的silo

<OrleansConfiguration xmlns="urn:orleans">
<Globals>
<SeedNode Address="localhost" Port="11111" />
</Globals>
<Defaults>
<Networking Address="localhost" Port="11111" />
<ProxyingGateway Address="localhost" Port="30000" />
</Defaults>
</OrleansConfiguration>

Orleans简单配置---服务端

这个世界有太多太多的选择了,大部分时候选择太多才是我苦恼的主要原因,为了某个组织方式,要和自己讨论,好不容易说服自己,又要和其他人讨论,到最后一般被否决(黑脸).不管怎么说,选择困难是人类的通病,没得选,大部分时候反而更能提高效率.所以说,这让我们明白一个道理:少读点书,让自己没得选,生活会更幸福. 当你看到不明白的地方,皱着眉头思索着,仿佛自己都能听到自己脑袋咔咔作响,感觉这就是你脑结构改变的过程.其实这是错觉,本质上还是因为犯愁.选择困难症又犯了,大脑不知道该唤醒那块区域…

以上这一段更本文有很大关系.

服务端配置主要是有两个方面,由于silo要与其他silo之间进行联系,组成一个集群,而且它还需要和client通信,所以它需要配置两个端口.一个用于silo间的通信,一个用于与client的通信.服务端需要配置关于集群的各个信息和关于自己节点的各个信息.所以总体来说服务端配置长成这样子

分两个节:Globals节和Defaults节.Globals里面都是关于集群的配置,而Defaults里面都是关于自己节点的配置.

既然说到集群,就不得不夸夸Orleans了.Orleans的集群在客户端看来,就仿佛是一个silo.而且对于silo内部运行的Grain类实例看来,也仿佛是一个silo.这样做的好处就是,你开发的时候使用单例silo进行开发,然后通过配置服务发现,配置持久化,以及把silo多复制几份,就可以做到分布式了.背后太多的工作都是Orleans完成的.同时Orleans还提供了检测机制,用于探测集群内部崩溃,掉线等原因而无法链接到的silo,以及新加入的silo等等.这些集群节点的变动对于Grain实例以及客户端来说,大部分情况都无需关心(仍需要关心小部分情况,比如所有节点都崩溃等等).

分布式程序中,一致性是一个重要的问题,Orleans集群内部维持一个MembershipTable(成员关系表),所有的集群节点都需要维持自己的成员关系表.所以在silo启动的时候会有如下记录:

这个表在集群的行为上发挥着重要的作用,这个按下不表,说一说山东好汉塞喽(silo).

要知道塞喽在Orleans中是一个实体类,但是集群不是,赛喽不知道集群的存在,它只知道按照配置文件与其他silo互动,这些所有的互动行为的结果,让人感觉它们合体了,是一个整体,这个整体有一个新的名字是梁山聚义堂.所以严格意义上来说,集群内部的silo中的Globals节点的配置可以不同.因为它就是告诉silo如何和其他silo进行互动的.但是我想没有人这么干(配置文件不相同).这是给自己添堵.

一个简单的服务端配置,如下图

可以看出来,这个节点本质上就是集群的主节点.membershipTable需要找一个地方存储,默认的是内存保存这个成员关系表,怎么看出来的?如下图

其中的GrainBasedMembershipTable就是Orleans用一个内置的Grain类管理了成员关系表.

之前说过成员关系表最终是要在各个silo之间统一的.所以在一个集群中如果有主silo,那么所有非主silo的成员关系表,就需要和主silo的统一.在从silo的日志中可以看到这样的记录

经过以上配置,一个简单的silo集群主silo就形成了.

现在我把从silo的配置文件也一起贴出来,大家看看变化,

虽然这个集群是可以工作的,但是不符合稳定性,而且灵活性也不够.因为如果主silo挂了,整个集群就挂了.在集群配置的时候,主要考虑以哪里的成员关系表为标准在集群内进行统一.正如前面说的,可以用数据库存储成员关系表.这样的配置文件就需要有所变化.至于如何变化,会再后续的文章中详细说明,比较集群的配置是Orleans的一项重要内容.所以在此暂且按下不表,说一说,引入配置的原因,那就是介绍如何持久化grain数据.

Orleans简单配置的更多相关文章

  1. 小丁带你走进git世界一-git简单配置

    小丁带你走进git世界一-git简单配置 1.github的简单配置 配置提交代码的信息,例如是谁提交的代码之类的. git config  –global user.name BattleHeaer ...

  2. 以实际的WebGIS例子探讨Nginx的简单配置

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 以实际项目中的一个例子来详细讲解Nginx中的一般配置,其中涉 ...

  3. CentOS 7.0 使用 yum 安装 MariaDB 与 MariaDB 的简单配置

    1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB,两条命令都可以 systemctl sta ...

  4. ssm简单配置

    MyBatis 是一个可以自定义SQL.存储过程和高级映射的持久层框架. MyBatis 摒除了大部分的JDBC代码.手工设置参数和结果集重获. MyBatis 只使用简单的XML 和注解来配置和映射 ...

  5. 安装MariaDB和简单配置

    1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...

  6. BIND的进程一:DNS简单配置与的主从配置

    DNS的简单配置和DNS的主从配置   摘要:DNS(Domain-Name Server) ,DNS的服务起到的作用就是名称解析,在网络通讯来说计算机与计算机是通过IP地址相互通信的, 当是IP地址 ...

  7. 转-squid介绍及其简单配置

    本文原始出处:http://linuxme.blog.51cto.com/1850814/372960 1.Squid是什么? Squid中文权威指南:http://zyan.cc/book/squi ...

  8. Linux中vim的简单配置

    本文主要分享Linux中vim的简单配置 ★配置文件的位置     在目录/etc.下面,有个名为vimrc的文件,这就是系统中公共的vim配置文件,对所有用户都开放.而在每个用户的主目录下,都可以自 ...

  9. CCNA网络工程师学习进程(6)vlan相关协议的配置与路由器简单配置介绍

        前面已经介绍了大部分与vlan技术相关的交换机的协议的配置,更深层次的还有STP协议和以太网端口聚合技术,接着还会简单介绍一下路由器的基本应用.     (1)STP(Spanning-tre ...

随机推荐

  1. Java IO学习笔记(五)对象流

    1.Object流:直接将Object写入或读出. 2.序列化:将Object直接转化成字节流写到硬盘或网络上. 3.如果想把一个对象转化成字节流,该对象的实体类必须得实现Serializable接口 ...

  2. 取得system32文件夹下面文件的写入权限

    取得system32文件夹下面文件的写入权限 TAKEOWN /F %SystemRoot%\system32\riched32.dll ICACLS %SystemRoot%\system32\ri ...

  3. java使用dom4j对XML进行CURD操作

    要使用dom4j必须导入两个jar包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 使用dom4j新建一个XML文件: /** * 利用dom4j完成新增一个xml文件 ...

  4. [基础架构]PeopleSoft工作原理(从浏览器发送请求开始)

    PeopleSoft体系结构是由几大组成部分构成,之前文章已经详细讲过,了解这几大组成部分是怎么协同工作的更为重要.在本文中将帮助您了解PeopleSoft的工作原理以及用户发送的请求是如何被解析以及 ...

  5. 【PHP】PHP面向对象编程--phpOOP入门

     PHP从入门到精通 之PHP的面相对象编程 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序 ...

  6. Luogu 1060 开心的金明 / NOIP 2006 (动态规划)

    Luogu 1060 开心的金明 / NOIP 2006 (动态规划) Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨 ...

  7. 如何生成Azure SAS Token

    在Azure PaaS服务密钥的安全性文章中,提到过客户端实际上发送的是Token,而不是密钥.那么Token是该如何生成呢? Azure相应服务的SDK其实都提供了或者内置了生成Token的方法,可 ...

  8. 一大波jQuery事件即将来袭!

    一.jQuery事件 1.focus()元素获得焦点 2.blur()元素失去焦点 3.change() 表单元素的值发生变化(可用于验证用户名是否存在) 4.click() 鼠标单击 5.dbcli ...

  9. java用户界面—创建一个面板

    先从基础学起 创建一个面板 代码如下: package Day08; import java.awt.FlowLayout; import javax.swing.JButton;import jav ...

  10. Android5.1 - 通讯录建立群组

    [问题] 在没有账户的时候,不应该有添加联系人群组的选项. 我们要把这个选项干掉. [相关log]06-23 17:25:00.804: E/GroupEditorFragment(6030): No ...