最近研究下java語言,根據一般使用的情況,寫了個連接通訊服務的框架; 框架結構 C-Manager-S; 把所有通訊內容抽取成三個方法介面:GetData,SetData,帶返還的Get; 所有數據都處理為byte[];客戶端與服務端和管理器以及服務端有多重處理模式 管理信息: 1.不需要中心管理 ...
最近研究下java語言,根據一般使用的情況,寫了個連接通訊服務的框架;
框架結構 C-Manager-S;
把所有通訊內容抽取成三個方法介面:GetData,SetData,帶返還的Get;
所有數據都處理為byte[];客戶端與服務端和管理器以及服務端有多重處理模式
管理信息:
1.不需要中心管理器;服務端啟動時向客戶端廣播自己綁定的地址;接收數據;客戶端使用時廣播一次請求,向所有服務端獲取服務信息;
2.管理中心:客戶端向管理器請求服務信息;服務端向管理器註冊地址;根據需要,可以把客戶端傳遞的數據直接轉發給服務,也可以將地址轉發給客戶端,具體哪種由客戶端需要決定
服務端:
1.服務端必須是命名的;整個結構以服務名稱為準;所有請求也以名稱為準;
2.服務端具有相同名稱時;根據服務配置;將服務分為主從模式和負載均衡模式;如果是主從模式,則管理器或者客戶端只調用主服務,當判斷主服務死掉才會啟用從服務;多個從服務時按照產生的序列依次啟用(也會按照時間,其實是參考了zookeeper中的選舉演算法);如果是負載均衡模式(沒有設置服務是主從模式則是負載均衡),負載均衡採用Hash一致演算法,抽取服務使用;
客戶端:
客戶端直接封裝為一個代理介面,又內部轉換,只需要調用介面方法,傳入服務名稱,返回一個代理介面,然後傳送數據
信息緩存:
採用了多個本地資料庫(關係型,非關係型,記憶體資料庫,都是本地化的);
傳輸層:
傳輸層現在只提供了最基本的TCP,UDP;我把通訊層高度抽取,抽取為介面,通過一個通訊管理器來創建介面對象(反射),只需要傳入一個名稱(“TCP”,"UDP")來建立通訊,方便修改,可以很靈活的修改通訊方式,也可以替換熟悉的第三方通訊;大家可以自己開發自己的通訊層,只需要實現介面,給該通訊取一個名稱即可
做了一個簡單的管理器界面如圖:
該框架中有一個序列化組件:magpack;另外就是本地化資料庫
現在網路上的框架組件都比較複雜比較大,比如:zookeeper;其實我們很多都是中小企業或者是小數據運用,沒有必要那麼複雜龐大,也不一定好維護,我只是想弄一個易用,通用,很小,很快的東西,簡化通訊處理,高度抽象;
另外就是所有網路組件都是選擇處理快,簡單的,尤其是免費開源;設計的時候考慮這些組件易更換,儘量不去複雜引用,儘可能抽象介面;
另外準備了一個載入更多的界面:
Java的界面當前不適合複雜開發,只是準備簡單的顯示
已經將代碼提交到了github;
框架功能將逐步更新,可能完善以後也會龐大,基於設計目標,在使用中會儘量模塊化,可以分離使用(比如只使用封裝的資料庫連接池,資料庫操作,通訊層,代理轉換這些);或通過配置,反射,介面分離代碼;
現在主要是JAVA語言實現,其實所有語言都一樣;
最後一點:很多人在部署時害怕中心節點,因為它掛了就一切完蛋。這裡的服務端可以有多種模式;至於管理器,它更加類似DNS解析地址,DNS都掛了,大家都沒有玩的了;不過可以討論有沒有其它方式,我考慮到用多個,內部替換(類似用zookeeper選舉一個中心的中心管理服務,然後切換),有懂通訊或者地址解析的多多提意見;
下一步完善可能添加的技術UDP挖洞;