Zookeeper——JAVA Client

一.zookeeper簡介html

    一款管理分佈式應用程序的協調服務系統java

二.zookeeper應用場景apache

    

    網上也有不少介紹,能夠參見    http://blog.csdn.net/xinguan1267/article/details/38422149api

本文主要介紹基於java的客戶端開發服務器

三.基於JAVA客戶端實戰session

3.1Client框架

    

// 建立一個與服務器的鏈接 須要(服務端的 ip+端口號)(session過時時間)(Watcher監聽註冊) 
		 ZooKeeper zk = new ZooKeeper("10.154.156.180:2181", 
		        3000, new Watcher() { 
		            // 監控全部被觸發的事件
					public void process(WatchedEvent event) {
						// TODO Auto-generated method stub
						System.out.println("已經觸發了" + event.getType() + "事件!"); 
					} 
		  });

		 // 建立一個目錄節點
		 /**
		  * CreateMode:
		  * 	PERSISTENT (持續的,相對於EPHEMERAL,不會隨着client的斷開而消失)
		  *		PERSISTENT_SEQUENTIAL(持久的且帶順序的)
		  *		EPHEMERAL (短暫的,生命週期依賴於client session)
		  *		EPHEMERAL_SEQUENTIAL  (短暫的,帶順序的)
		  */
		 zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 
		 
		 // 建立一個子目錄節點
		 zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 
		 System.out.println(new String(zk.getData("/testRootPath",false,null))); 
		 
		 // 取出子目錄節點列表
		 System.out.println(zk.getChildren("/testRootPath",true)); 	
		 
		 // 建立另一個子目錄節點
		 zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 		 
		 System.out.println(zk.getChildren("/testRootPath",true)); 	
		 
		// 修改子目錄節點數據
		 zk.setData("/testRootPath/testChildPathOne","hahahahaha".getBytes(),-1); 	 		 
		 byte[] datas = zk.getData("/testRootPath/testChildPathOne", true, null);
		 String str = new String(datas,"utf-8");
		 System.out.println(str); 	
		 
		 //刪除整個子目錄   -1表明version版本號,-1是刪除全部版本
		 zk.delete("/testRootPath/testChildPathOne", -1);	 
		 System.out.println(zk.getChildren("/testRootPath",true)); 
		 System.out.println(str);

 

部分例式    具體可參見官網api: http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/ZooKeeper.html#create%28java.lang.String,%20byte%5B%5D,%20java.util.List,%20org.apache.zookeeper.CreateMode%29分佈式

3.2Curatorui

    Curator框架提供了一套高級的API, 簡化了ZooKeeper的操做。 它增長了不少使用ZooKeeper開發的特性,能夠處理ZooKeeper集羣複雜的鏈接管理和重試機制。 這些特性包括:spa

    • 封裝ZooKeeper client與ZooKeeper server之間的鏈接處理;

    • 提供了一套Fluent風格的操做API;

    • 提供ZooKeeper各類應用場景(recipe, 好比共享鎖服務, 集羣領導選舉機制)的抽象封裝.

  • 關於Fluent風格能夠查看個人一篇博客(建造者模式),在偶看es搜索源碼時發現也使用了Fluent風格。

  • 以下是使用Curator建立對象的方法

  • public static CuratorFramework createWithOptions(String connectionString, RetryPolicy retryPolicy, int connectionTimeoutMs, int sessionTimeoutMs) {
            
            return CuratorFrameworkFactory.builder().connectString(connectionString)
                    .retryPolicy(retryPolicy)
                    .connectionTimeoutMs(connectionTimeoutMs)
                    .sessionTimeoutMs(sessionTimeoutMs)
                    .build();
        }

調用代碼以下:

       
client = createWithOptions("10.154.156.180:2181", new ExponentialBackoffRetry(1000, 3), 1000, 1000);
client.start();

 

 

若是須要建立新目錄節點 依然是Fluent風格

client.create().forPath("/curator", new byte[0]);
client.create().withMode(CreateMode.PERSISTENT).forPath("/curator/childOne", new byte[0]);

 

 

固然建立zk也能夠不使用Fluent風格

public static CuratorFramework createSimple(String connectionString) {        
        ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);        
        return CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
}

 

 

其餘方法說明: 

  • create(): 發起一個create操做. 能夠組合其餘方法 (好比mode 或background) 最後以forPath()方法結尾

  • delete(): 發起一個刪除操做. 能夠組合其餘方法(version 或background) 最後以forPath()方法結尾

  • checkExists(): 發起一個檢查ZNode 是否存在的操做. 能夠組合其餘方法(watch 或background) 最後以forPath()方法結尾

  • getData(): 發起一個獲取ZNode數據的操做. 能夠組合其餘方法(watch, background 或get stat) 最後以forPath()方法結尾

  • setData(): 發起一個設置ZNode數據的操做. 能夠組合其餘方法(version 或background) 最後以forPath()方法結尾

  • getChildren(): 發起一個獲取ZNode子節點的操做. 能夠組合其餘方法(watch, background 或get stat) 最後以forPath()方法結尾

  • inTransaction(): 發起一個ZooKeeper事務. 能夠組合create, setData, check, 和/或delete 爲一個操做, 而後commit() 提交

相關文章
相關標籤/搜索