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. SerializableObj

    package JBJADV003; import java.io.*; public class SerializableObj { /** * @param args * @throws IOEx ...

  2. intellij idea 常用快捷键让你事半功倍

    为什么谈这个 工欲善其事必先利其器,键盘流是必须的,快捷键首当其冲,请收下!!! 常用快捷键列表 Live Templates 自定义代码模板 取消屏幕的翻转,可以使用ctrl+alt+左右,进行代码 ...

  3. JavaWeb 后端 <六> 之 EL & JSTL 学习笔记

    一.EL表达式(特别重要)

  4. JAXP Dom 案例 对xml文件进行增加 查找 删除

    利用 JAXP 对 XML文件 的处理,把xml当做一个数据库来对待

  5. Carbondata源码系列(一)文件生成过程

    在滴滴的两年一直在加班,人也变懒了,就很少再写博客了,最近在进行Carbondata和hive集成方面的工作,于是乎需要对Carbondata进行深入的研究. 于是新开一个系列,记录自己学习Carbo ...

  6. 51nod_1384:全排列(STL)

    题目链接 记住next_permutation函数的用法,另外string在这里比char[]慢好多啊.. //#include<bits/stdc++.h> //using namesp ...

  7. Work 1(导游类)(2017.06.27)

  8. (转)Linux系统安装时分区的选择

    场景:对于Linux系统的分区总是迷迷茫茫的,还是实践少,基础不牢. 以前初识Linux时,对Linux系统安装时分区的选择,一点都不了解,导致几次没法进行下一步安装,因此就静下心来,专门拿出时间研究 ...

  9. Objectiv-C UIKit基础 NSLayoutConstraint的使用(VFL实现)

    利用VFL可视化语言 (简单的抛砖引玉) 构建3个View 橙色和绿色左中右间隔20 上间隔40 高为200 蓝色在橙色内(0,0)处 宽高为橙色的一半 实现效果如下 由于atutosize和auto ...

  10. Redux源码分析之compose

    Redux源码分析之基本概念 Redux源码分析之createStore Redux源码分析之bindActionCreators Redux源码分析之combineReducers Redux源码分 ...