RSF-Center,集群模式下-协调数据结构

    RSF是一个轻量化的分布式服务框架。支持点对点调用,也支持分布式调用。典型的应用场景是,将同一个服务部署在多个Server上提供 request、response 消息通知。它的设计思想是:通过Netty实现对自有协议数据交互的封装,支持高并发、高可靠的分布式RPC框架,设计原理参考了淘宝HSF。

    RSF设计:http://my.oschina.net/u/1166271/blog/316686
    注册中心设计:http://my.oschina.net/u/1166271/blog/477190
    RSF源码地址:http://git.oschina.net/zycgit/rsf,本文中众多范本配置均来自与源码中的实际案例。

    本文主要介绍,RSF注册中心在集群模式下维护的 ZooKeeper节点数据结构,相信有了这个数据结构就不需要太费口舌去介绍RSF注册中心集群模式下如何管理集群数据了。

一、RSF-Center维护的 ZooKeeper 目录结构

/rsf-center --------------------------- RSF-Center
    /servers -------------------------- 注册中心集群列表
        /192.168.1.11:2180 ------------ 服务器IP:消息通信端口
        /info ------------------------- 详细信息
        /auth ------------------------- 认证秘钥,用来防止集群之外的机器利用RSF传输协议伪造消息
        /version ---------------------- rsf-center版本
        /heartbeat -------------------- 服务器状态(用来表示服务器状态,在线还是离线等)
    /leader --------------------------- Leader是谁
    /services ------------------------- 服务信息
        /group ------------------------ 服务所属分组
            /name --------------------- 服务名称
                /version -------------- 服务版本
                    /info ------------- 服务信息
                    /provider --------- 提供者列表
                        /192.168.1.11:2180
                        /192.168.1.11:2180
                        /192.168.1.11:2180
                    /consumer --------- 消费者列表
                        /192.168.1.11:2180
                        /192.168.1.11:2180
                        /192.168.1.11:2180
                    /flowcontrol ------ 流控规则
                    /rule ------------- 路由规则
                        /args-level --- 参数级路由规则
                        /method-level - 方法级路由规则
                        /service-level  服务级路由规则
    /config --------------------------- 默认规则设置
        /flowcontrol ------------------ 默认流控规则
        /rule ------------------------- 默认路由规则
            /args-level --------------- 参数级路由规则
            /method-level ------------- 方法级路由规则
            /service-level ------------ 服务级路由规则

二、注册中心服务器数据

节点:/rsf-center/servers/192.168.1.11:2180/info
    该节点是用来保存,RSF-Center的信息,主要列出了注册中心服务器的工作模式以及必要的端口数据。

<info>
    <workMode>master</workMode>					<!-- 工作模式:Master、Slave、Alone -->
    <inetAddress>192.168.1.11</inetAddress>			<!-- 注册中心地址,RSF客户端连接到这个地址 -->
    <rsf.bindPort>2180</rsf.bindPort>				<!-- 注册中心端口,RSF客户端连接到这个端口 -->
    <zooKeeper.sid>0</zooKeeper.sid>				<!-- 集群中sid -->
    <zooKeeper.bindPort>2181</zooKeeper.bindPort>		<!-- 集群中用于zk信息传输的端口 -->
    <zooKeeper.electionPort>2182</zooKeeper.electionPort>	<!-- 集群中用于zk选举的端口 -->
</info>

节点:/rsf-center/servers/192.168.1.11:2180/auth
    内容是一段随机字符串,RSF-Center在接收来自其它RSF-Center的数据包时会使用该字符串进行校验。

xsfasjnfasldjhasdfiffaj
节点:/rsf-center/servers/192.168.1.11:2180/version
    表示注册中心的程序版本
1.0.0

节点:/rsf-center/servers/192.168.1.11:2180/heartbeat
    表示最后一次该注册中心在线时的心跳时间

2016-02-02-22:22:22

节点:/rsf-center/leader
    表示当前Leader服务器是谁,作为leader,负责一些重要的写操作。

192.168.1.11:2180

三、注册中心服务信息数据

节点:/rsf-center/services/group/name/version/info
    假如有一个RSF服务,所属分组为:RSF,服务名称为:org.hasor.test.HelloWord,服务版本为:1.0.0。那么它的节点路径是:
    /rsf-center/services/RSF/org.hasor.test.HelloWord/1.0.0/info

<info>
    <bindID>[RSF]-org.hasor.test.HelloWord-1.0</bindID>	<!-- BindID -->
    <group>RSF</group>					<!-- Group -->
    <name>org.hasor.test.HelloWord</name>		<!-- Name -->
    <version>1.0</version>				<!-- Version -->
    <bindType>org.hasor.test.HelloWord</bindTypen>	<!-- Type -->
    <serviceList>					<!-- 接口信息 -->
        <method>org.hasor.test.HelloWord.hello(String,Long)</method>
        <method>org.hasor.test.HelloWord.hello(String,Long)</method>
        <method>org.hasor.test.HelloWord.hello(String,Long)</method>
    </serviceList>
</info>

节点:/rsf-center/services/group/name/version/provider/192.168.1.11:2180
    该节点是表示服务的提供者,假如有两个服务提供者,就会有两个这样的节点。不同的是,对应最后一个节点的地址会不一样。节点的数据内容格式如下:

<info>
    <serializeType>java</serializeType>		<!-- 传输序列化协议 -->
    <client.timeout>6000</client.timeout>	<!-- rsf调用超时时间-->
    <queue.maxSize>4096</queue.maxSize>		<!-- 最大服务处理队列长度 -->
</info>

节点:/rsf-center/services/group/name/version/consumer/192.168.1.11:2180
    该节点是表示服务的消费者,假如有多个服务提供者,就会有多个这样的节点。不同的是,对应最后一个节点的地址会不一样。节点的数据内容格式如下:

<info>
    <serializeType>java</serializeType>			<!-- 传输序列化协议 -->
    <client.timeout>6000</client.timeout>		<!-- rsf调用超时时间-->
    <client.maximumRequest>200</client.maximumRequest>	<!-- 最大并发请求数 -->
</info>

节点:/rsf-center/services/group/name/version/flowcontrol
    该节点是用来保存服务自身的个性化流控规则配置信息,流控配置范本如下:

<controlSet>
    <!-- 单元化规则 -->
    <flowControl enable="true" type="unit">
        <threshold>0.3</threshold>			<!-- 本地机房占比低于这个数时启用跨机房 -->
        <exclusions>172.23.*,172.19.*</exclusions>	<!-- 当本机IP属于下面这个网段时则不生效 -->
    </flowControl>
    <!-- 服务地址选取规则 -->
    <flowControl enable="true" type="random">
    </flowControl>
    <!-- QoS流量控制规则 -->
    <flowControl enable="true" type="Speed">
        <action>service</action>			<!-- 速率控制方式:每服务、每方法、每地址 -->
        <rate>5</rate>					<!-- 稳态速率 -->
        <peak>100</peak>				<!-- 峰值速率 -->
        <timeWindow>10</timeWindow>			<!-- 时间窗口 -->
    </flowControl>
</controlSet>

节点:/rsf-center/services/group/name/version/rule/service-level
    该节点是用来配置服务路由规则脚本,服务级,下面是脚本范本,脚本语言为:groovy

def List<String> evalAddress(String serviceID,List<String> allAddress)  {
    //
    //[RSF]sorg.mytest.FooFacse-1.0.0 ---- Group=RSF, Name=sorg.mytest.FooFacse, Version=1.0.0
    if ( serviceID == "[RSF]test.net.hasor.rsf.services.EchoService-1.0.0" ) {
        return [
            "192.168.137.10:8000",
            "192.168.137.11:8000"
        ]
    }
    return null
}
节点:/rsf-center/services/group/name/version/rule/method-level
    该节点是用来配置服务路由规则脚本,方法级,下面是脚本范本,脚本语言为:groovy
def Map<String,List<String>> evalAddress(String serviceID,List<String> allAddress)  {
    //
    //[RSF]sorg.mytest.FooFacse-1.0.0 ---- Group=RSF, Name=sorg.mytest.FooFacse, Version=1.0.0
    if ( serviceID == "[RSF]test.net.hasor.rsf.services.EchoService-1.0.0" ) {
        return [
            "sayEcho":[
                "192.168.137.10:8000",
                "192.168.137.11:8000"
            ],
            "testUserTag":[
                "192.168.2.3:8000",
                "192.168.3.4:8000",
                "192.168.4.5:8000"
            ]
        ]
    }
    return null
}


节点:/rsf-center/services/group/name/version/rule/args-level
    该节点是用来配置服务路由规则脚本,参数级,下面是脚本范本,脚本语言为:groovy

def Map<String,Map<String,List<String>>> evalAddress(String serviceID,List<String> allAddress)  {
    //
    //[RSF]sorg.mytest.FooFacse-1.0.0 ---- Group=RSF, Name=sorg.mytest.FooFacse, Version=1.0.0
    if ( serviceID == "[RSF]test.net.hasor.rsf.services.EchoService-1.0.0" ) {
        return [
            "sayEcho":[
                "sayTo_etc1":[
                    "192.168.2.3:8000",
                    "192.168.3.4:8000",
                    "192.168.4.5:8000"
                ],
                "sayTo_etc2":[
                    "192.168.137.10:8000",
                    "192.168.137.11:8000"
                ]],
            "testUserTag":[
                "server_3":[
                    "192.168.1.3:8000"
                ],
                "server_4":[
                    "192.168.1.4:8000"
                ]
            ]
        ]
    }
    return null
}


你可能感兴趣的:(RSF-Center,集群模式下-协调数据结构)