今天我们来说说 Zookeeper 客户端启动,整个文章分三个部分:第一部分是 Zookeeper 原生 API 客户端,第二部分是开源客户端 ZkClient,第三部分是开源客户端 Curator。

 【Zookeeper API】  

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

  

 创建会话

  •  new ZooKeeper(String connectString,int sessionTimeOut,Watcher watcher)
  •  new ZooKeeper(String connectString,int sessionTimeOut,Watcher watcher,boolean canBeReadOnly)
  •  new ZooKeeper(String connectString,int sessionTimeOut,Watcher watcher,long sessionId,byte[] sessionPasswd)
  •  new ZooKeeper(String connectString,int sessionTimeOut,Watcher watcher,long sessionId,byte[] sessionPasswd,boolean canBeReadOnly)
  •  上面四个构造函数都可以创建会话,不同的在于构造参数。
  •  connectString 就是 host:port 字符串,例如 127.0.0.1:2181,也可以是多个,192.168.0.10:2181,192.168.0.11:2181,192.168.0.12:2181,多个地址表示集群。我们也可以指定到根目录,例如 192.168.0.10:2181/test,这样 Zookeeper服务连接后,所有的操作是针对 test 根目录。
  •  sessionTimeOut 就是会话超时时间,单位是毫秒。如果在会话超时时间内没有检查到心跳,则会话失效。
  •  watcher 就是监听器,也可以说是通知,如果传给构造函数 watcher 不为空,则会话创建成功后会有通知到客户端。收到通知后,客户端可以做一些事情。但是 watcher 的生命周期很短,通知一次过后就失效了,需要反复的注册。
  •  canBeReadOnly 是一个 boolean 类型,如果是 true,则当 Zookeeper 服务器故障,服务器还可以提供读服务。
  •  sessionId 就是会话序列号,sessionPasswd 就是会话密码,它们的作用就是会话复用,可以达到恢复会话作用。

 

 创建节点

  •  String create(final String path,byte data[],List<ACL> acl,CreateMode createMode)
  •  void create(final String path,byte data[],List<ACL> acl,CreateMode createMode,StringCallback cb,Object ctx)
  •  path 就是要创建的节点路径,例如 /app,在根节点 / 下创建 app 节点。
  •  data[] 就是节点内容,字节数组形式。
  •  acl 就是节点 ACL 策略。
  •  createMode 就是节点类型,分为持久,持久顺序,临时,临时顺序。
  •  cb 就是异步回调方法。实现 StringCallback 接口即可。
  •  ctx 用于传递一个对象,一般是上下文信息。

 

package zookeeper.client;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.KeeperState;

public class ZKClient {
	
	private static CountDownLatch down = new CountDownLatch(1);
	
	private ZooKeeper zk;
	
	public void getNode(){
		String path = "/";
		try {
			zk = new ZooKeeper("127.0.0.1:2181", 5000, new MyWatcher());
			down.await();
			zk.create(path+"app", "hello".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	class MyWatcher implements Watcher{
		public void process(WatchedEvent e) {
			if(KeeperState.SyncConnected == e.getState()){
				System.out.println("SyncConnected");
				if(EventType.None == e.getType() && null == e.getPath()){
					down.countDown();
				}else if(e.getType() == EventType.NodeChildrenChanged){
					try {
						System.out.println("NodeChildrenChanged"+zk.getChildren("/", true));
					} catch (KeeperException e1) {
						e1.printStackTrace();
					} catch (InterruptedException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				}
			}
			
		}
		
	}

}

 

  

 

 

 

 删除节点

  •  public void delete(final String path,int version)
  •  public void delete(final String path,int version,VoidCallback cb,Object ctx)
  •  path 就是要删除的节点路径。
  •  version 就是节点版本号。
  •  cb 就是回调方法。
  •  ctx 就是传递上下文信息对象。

 

 读取节点

 (一)、getChildren 获取一个节点所有子节点。

  •  List<String> getChildren(final String path,Watcher watcher)
  •  List<String> getChildren(final String path,boolean watcher)
  •  void getChildren(final String path,Watcher watcher,ChildrenCallback cb,Object ctx)
  •  void getChildren(final String path,boolean watcher,ChildrenCallback cb,Object ctx) 
  •  List<String> getChildren(final String path,Watcher watcher,Stat stat)
  •  List<String> getChildren(final String path,boolean watcher,Stat stat)

 (二)、getData 获取一个节点内容。

  •  byte[] getData(final String path,Watcher watcher,Stat stat)
  •  byte[] getData(final String path,boolean watcher,Stat stat)
  •  void getData(final String path,Watcher watcher,DataCallback cb,Object ctx)
  •  void getData(final String path,boolean watcher,DataCallback cb,Object ctx)
  •  stat 就是节点的状态信息。包括 cZxid、mZxid,pZxid等。

 更新节点

  • Stat setData(final String path,byte data[],int version)
  • void setData(final String path,byte data[],int version,StatCallback cb,Object ctx) 

 检测节点是否存在

  • public Stat exists(final String path,Watcher watcher)
  • public Stat exists(final String path,boolean watch)
  • public void exists(final String path,Watcher watcher,StatCallback cb,Object ctx)
  • public void exists(final String path,boolean watch,StatCallback cb,Object ctx)

  谢谢大家观看!

 

转载于:https://www.cnblogs.com/xums/p/7123551.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐