前言
前提:保证zookeeper101,zookeeper102,zookeeper103服务器上Zookeeper集群服务端启动。
一、IDEA环境搭建
1、创建一个maven工程:zookeeper
2、在pom文件添加依赖:
3、在src/main/resources目录下,新建一个文件,命名为"log4j.properties",在文件中填入:
4、创建包名com.xing.zk:
5、创建类名zkClient:
二、创建Zookeeper客户端
1、需要服务器地址和连接过期时间,需要监听器后续可以添加:
private String connectString = "zookeeper101:2181,zookeeper102:2181,zookeeper103:2181";
private int sessionTimeout = 2000;
private ZooKeeper zkClient;
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
public void process(WatchedEvent watchedEvent) {
}
});
}
测试连接是否成功:
可以看到已经连接成功。
2、测试创建节点:
@Test
public void create() throws KeeperException, InterruptedException {
String nodeCreated = zkClient.create("/sanguo", "wuzx".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
“/sanguo”:创建的节点的路径;
“wuzx”.getBytes():节点里面的值,需要转化为字节传输;
“ZooDefs.Ids.OPEN_ACL_UNSAFE”:权限控制,设置访问权限;
CreateMode.PERSISTENT:创建的节点类型,如这个是永久不带序号节点。
目前只有一个zookeeper节点:
执行上述步骤:
节点创建成功。
注意:创建节点需要在连接上zookeeper集群才能成功,也就是先连接成功再创建节点。
三、获取子节点并监听节点变化
1、获取子节点:
@Test
public void getChildren() throws KeeperException, InterruptedException {
List<String> children = zkClient.getChildren("/", true);
for (String child : children){
System.out.println(child);
}
//延时
Thread.sleep(Long.MAX_VALUE);
}
true:会使用初始化的监听器,也可以自己new一个监听器。
运行在idea看到如下节点:
但是监听器只能监听一次,如果再发生变化需要重新注册监听器,要想每次节点发生变化都能检测到并且在控制台打印,就在初始化监听器里面再注册一个监听器,每次监听完又马上注册一个新的监听器。
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
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);
}
System.out.println("==================");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
四、判断Znode是否存在
@Test
public void exist() throws KeeperException, InterruptedException {
Stat stat = zkClient.exists("/sanguo", false);
System.out.println(stat==null ? "not exists" : "exists");
}
如果存在则返回exists,想观察服务器存在的节点:
"/sanguo"节点是存在的,结果应该是exists,观察控制台打印结果:
确实存在,输入一个不存在的节点并观察控制台打印结果:
五、遇到的问题
连接不上zookeeper集群的原因:
①linux防火墙未关闭;
解决:
查看防火墙状态,未关闭需要先关闭。
②地址映射问题;
解决:需要在Windows系统的hosts文件中加入集群中各主机的地址(和linux系统中zookeeper的配置文件zoo.cfg文件一样):