RSF是一個輕量化的分佈式服務框架。支持點對點調用,也支持分佈式調用。典型的應用場景是,將同一個服務部署在多個Server上提供 request、response 消息通知。它的設計思想是:經過Netty實現對自有協議數據交互的封裝,支持高併發、高可靠的分佈式RPC框架,設計原理參考了淘寶HSF。 java
RSF設計:http://my.oschina.net/u/1166271/blog/316686
註冊中心設計:http://my.oschina.net/u/1166271/blog/477190
RSF源碼地址:http://git.oschina.net/zycgit/rsf,本文中衆多範本配置均來自與源碼中的實際案例。 git
本文主要介紹,RSF註冊中心在集羣模式下維護的 ZooKeeper節點數據結構,相信有了這個數據結構就不須要太費口舌去介紹RSF註冊中心集羣模式下如何管理集羣數據了。 shell
/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 dom
<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
該節點是表示服務的消費者,假若有多個服務提供者,就會有多個這樣的節點。不一樣的是,對應最後一個節點的地址會不同。節點的數據內容格式以下: ide
<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 }