目錄html
瘋狂創客圈 Java 分佈式聊天室【 億級流量】實戰系列之 -23【 博客園 總入口 】java
@node
你們好,我是做者尼恩。目前和幾個小夥伴一塊兒,組織了一個高併發的實戰社羣【瘋狂創客圈】。正在開始高併發、億級流程的 IM 聊天程序 學習和實戰面試
前面,已經完成一個高性能的 Java 聊天程序的四件大事:api
接下來,須要進入到分佈式開發的環節了。 分佈式的中間件,瘋狂創客圈的小夥伴們,一致的選擇了zookeeper,不單單是因爲其在大數據領域,太有名了。更重要的是,不少的著名框架,都使用了zk。數組
本篇介紹和對比zookeeper的兩個客戶端。session
Zookeeper應用開發,須要使用Zookeeper的java 客戶端API ,去鏈接和操做Zookeeper 集羣。併發
能夠供選擇的java 客戶端API 有:Zookeeper 官方的 java客戶端API,第三方的java客戶端API。框架
Zookeeper官方的 客戶端API提供了基本的操做,好比,建立會話、建立節點、讀取節點、更新數據、刪除節點和檢查節點是否存在等。但對於開發人員來講,Zookeeper提供的基本操縱仍是有一些不足之處。分佈式
Zookeeper API不足之處以下:
(1)Zookeeper的Watcher是一次性的,每次觸發以後都須要從新進行註冊;
(2)Session超時以後沒有實現重連機制;
(3)異常處理繁瑣,Zookeeper提供了不少異常,對於開發人員來講可能根本不知道該如何處理這些異常信息;
(4)只提供了簡單的byte[]數組的接口,沒有提供針對對象級別的序列化;
(5)建立節點時若是節點存在拋出異常,須要自行檢查節點是否存在;
(6)刪除節點沒法實現級聯刪除;
第三方開源客戶端主要有zkClient和Curator。
ZkClient是一個開源客戶端,在Zookeeper原生API接口的基礎上進行了包裝,更便於開發人員使用。zkClient客戶端,在一些著名的互聯網開源項目中,獲得了應用,好比:阿里的分佈式dubbo框架,對它進行了集成使用。
zkClient解決了Zookeeper原生API接口的不少問題。好比,zkClient提供了更加簡潔的api,實現了session會話超時重連、Watcher反覆註冊等問題。雖然ZkClient對原生API進行了封裝,但也有它自身的不足之處。
具體以下:
(1)zkClient社區不活躍,文檔不夠完善,幾乎沒有參考文檔;
(2)異常處理簡化(拋出RuntimeException);
(3)重試機制比較難用;
(4)沒有提供各類使用場景的參考實現;
Curator是Netflix公司開源的一套Zookeeper客戶端框架,和ZkClient同樣,解決了很是底層的細節開發工做,包括鏈接重連、反覆註冊Watcher和NodeExistsException異常等。Curator是Apache基金會的頂級項目之一,Curator具備更加完善的文檔,另外還提供了一套易用性和可讀性更強的Fluent風格的客戶端API框架。
不止上面這些,Curator中還提供了Zookeeper各類應用場景(Recipe,如共享鎖服務、Master選舉機制和分佈式計算器等)的抽象封裝。
另外,Curator供了一套很是優雅的鏈式調用api,對比ZkClient客戶端 Api的使用,發現 Curator的api 優雅太多。
使用ZkClient客戶端,建立節點的代碼爲:
``` ZkClient client = new ZkClient("192.168.1.105:2181", 10000, 10000, new SerializableSerializer()); System.out.println("conneted ok!"); String zkPath = "/test/node-1"; Stat stat = new Stat(); User u = client.readData(zkPath, stat); ```
使用Curator客戶端,建立節點的代碼以下:
``` CuratorFramework client = CuratorFrameworkFactory.newClient( connectionString, retryPolicy); String zkPath = "/test/node-1"; client.create().withMode(mode).forPath(zkPath); ```
總之,因爲Curator客戶端確實很是優秀,Patrixck Hunt(Zookeeper)以一句「Guava is to Java that Curator to Zookeeper」,對Curator給予了高度評價。
所以,對於Zookeeper的客戶端,咱們這裏只學習和研究Curator的使用。並且,在實際的開發場景中,使用Curator客戶端,就足能夠應付平常的Zookeeper集羣操做需求。
瘋狂創客圈社羣的億級流量IM實戰項目,也使用Curator客戶端來操做Zookeeper集羣。
下一篇:開啓zk的客戶端開發。
Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰
瘋狂創客圈 【 博客園 總入口 】