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
}