Zookeeper的客戶端API使用


一、Zookeeper的原生API使用

zookeeper 提供了java與C兩種語言的客戶端。我們學習的java的客戶端使用,引入maven的jar包依賴。

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.5.8</version>
</dependency>

客戶端類:org.apache.zookeeper.ZooKeeper

1、初始連接

實例化 Zookeeper 類之后將會自動與集群建立連接。構造方法的參數:

  • connectString(String):連接串,包括ip+端口 ,集群模式下用逗號隔開;
  • sessionTimeout(int):會話超時時間,該值不能超過服務端所設置的minSessionTimeout 和maxSessionTimeout;
  • watcher(Watcher):會話監聽器,服務端事件將會觸該監聽;
  • sessionId(long):自定義會話ID;
  • sessionPasswd(byte[]):會話密碼;
  • canBeReadOnly(boolean):該連接是否為只讀的;
  • hostProvider(HostProvider):服務端地址提供者,指示客戶端如何選擇某個服務來調用,默認采用StaticHostProvider實現;
ZooKeeper zooKeeper = new ZooKeeper("192.168.1.1:2181", 4000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
            }
        });

2、創建節點  create方法

create的參數說明:

  • path(String):節點路徑;
  • data(btye[]):節點存儲的數據;
  • acl(List<ACL>):節點的權限;
  • createMode(CreateMode):節點的類型(持久、持久序號、臨時、臨時序號)
  • cb(StringCallback):
  • ctx(Object):
public void create() throws KeeperException, InterruptedException {
    int perm = ZooDefs.Perms.ADMIN | ZooDefs.Perms.READ; // ra
    List<ACL> aclList = new ArrayList<>();
    aclList.add(new ACL(perm, new Id("world", "anyone")));
    aclList.add(new ACL(perm, new Id("ip", "127.0.0.1")));
    String s = zooKeeper.create("/china/xi'an", "Hel".getBytes(), aclList, CreateMode.PERSISTENT);
    System.out.println(s);
}

3、查看節點 getData 方法

getData 方法的參數:

  • path(String):節點的路徑;
  • watch(boolean):是否監聽;若為 true,當前事件觸發之后會調用連接到zookeeper時構造函數中定義的 Watcher.process() 方法。
  • watcher(Watcher) :會話監聽器;自定義監聽;
  • cb(DataCallback):數據回調
  • ctx(Object):

注:所有的監聽都是一次性的,如果要持續監聽需要觸發后在添加一次監聽。

public void getData3() throws KeeperException, InterruptedException {
        Stat stat = new Stat();
        //獲取節點數據時添加監聽;當監聽事件出發之后,再次去添加該監聽
        byte[] data = zooKeeper.getData("/china", new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                try {
					//再次添加監聽
                    zooKeeper.getData(watchedEvent.getPath(), this, null);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("listener: " + watchedEvent);
            }
        }, stat);
        System.out.println(new String(data));
        System.out.println(stat);
        Thread.sleep(Long.MAX_VALUE);
}

4、查看子節點 getChildren 方法

getChildren 方法的參數:

  • path(String):節點的路徑;
  • watch(boolean):是否監聽;
  • watcher(Watcher) :會話監聽器;
  • cb(Children2Callback):
  • ctx(Object):
 public void getChild() throws KeeperException, InterruptedException {
        List<String> children = zooKeeper.getChildren("/china", false, null);
        children.stream().forEach(System.out::println);
 }

二、使用 ZkClient 客戶端

ZkClient是由Datameer的工程師開發的開源客戶端,是在zookeeper客戶端基礎之上封裝的,同時在內部實現了諸如session超時重連、watcher反復注冊等功能,使用上更加方便;主要變化:

  • 可以設置持久監聽,或刪除某個監聽;
  • 可以插入JAVA對象,自動進行序列化和反序列化;
  • 簡化了基本的增刪改查操作。

添加maven的jar包依賴:

<!--zkClient-->
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
     <groupId>com.101tec</groupId>
     <artifactId>zkclient</artifactId>
     <version>0.11</version>
</dependency>

 

zkClient鏈接:

https://www.jianshu.com/p/d6de2d21d744

https://www.cnblogs.com/rouqinglangzi/p/11152580.html

https://www.cnblogs.com/xbq8080/p/6622606.html

 

 

 

 

 

 

path

String

 

watch

boolean

 

watcher

Watcher

 

cb

Children2Callback 

 

ctx

Object

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM