1、项目依赖
创建maven项目,添加依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.3-beta</version>
</dependency>
</dependencies>
2、创建客户端
public class ZkClient {
//zookeeper地址和端口
private String connectString = "服务器IP:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient;
@Test
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
}
我们运行一下,可以看到连接成功
创建客户端的构造方法:
ZooKeeper(String connectString,int sessionTimeout,Watcher watcher)
ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,boolean canReadOnly)
ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd)
ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd,boolean canReadOnly)
3、操作节点
1.创建节点常用接口
String create(final String path,byte[] data,List<ACL>acl,CreateModel createModel);
String create(final String path,byte[] data,List<ACL> acl,CreateModel,StringCallback cb,Object ctx);
2.删除节点常用接口
void delete(final String path,int version);
void delete(final String path,int version,VoidCallback cb,Object ctx);
3.获取子节点列表接口
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);
void getChildren(final String path,Watcher watcher,Stat stat,ChildrenCallback cb,Object ctx);
void getChildren(final String path,boolean watcher,Stat stat,ChildrenCallback cb,Object ctx);
4.获取节点数据接口
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,Stat stat,DataCallback cb,Object ctx);
void getData(final String path,boolean watcher,Stat stat,DataCallback cb,Object ctx);
5.更新数据接口
Stat setData(final String path,byte[] data,int version);
void setData(final String path,byte[] data,int version,StatCallback cb,Object ctx);
6.检查节点是否存在接口
Stat exists(final String path,Watcher watcher);
Stat exists(final String path,boolean watcher);
void exists(final String path, Watcher watcher,StatCallback cb,Object ctx);
void exists(final String path,boolean watcher,StatCallback cb,Object ctx);
新增节点示例:
public class ZkClient {
private String connectString = "服务器地址:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient;
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
//创建节点
@Test
public void create() throws KeeperException, InterruptedException, IOException {
String nodeCreated = zkClient.create("/sss", "test001".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
}
运行后,我们可以输入命令ls /
从服务器上查看结果
输入get -s /sss
查看详情
4、监听节点
Zookeeper监听机制的特点:
1.一次性触发 数据发生改变时,一个watcher event会被发送到client,但是client只会收到一次这样的信息。
2.watcher event异步发送 watcher 的通知事件从server发送到client是异步的,这就存在一个问题,
不同的客户端和服务器之间通过socket进行通信,由于网络延迟或其他因素导致客户端在不通的时刻监听到事件,
由于Zookeeper本身提供了ordering guarantee,即客户端监听事件后,才会感知它所监视znode发生了变化。
3.数据监视 Zookeeper有数据监视和子数据监视 getdata() and exists()
(exists()可以判断某一个节点是否存在)设置数据监视,getchildren()设置了子节点监视
4.注册watcher getData、exists、getChildren
5. 触发watcher create、delete、setData
子节点监听示例:
public class ZkClient {
private String connectString = "服务器地址:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient;
@Test
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("监听---------------------------------");
List<String> children = null;
try {
children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
}