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 --------------------------- 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
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 }