在使用 Java API 对 Zookeeper 进行操作是,首先需要引入相关的依赖。
在引入 zookeeper 的相关依赖时,我们需要注意添加的依赖的版本号要与在服务器上部署的 zookeeper 版本相对应。 我们可以在该网址上寻找相对应版本:https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
</dependency>
Step2: 使用 Zookeeper 成功创建一个节点
public class ZKTest {
public static String serverURL = "192.168.16.130:2181";
public static int timeout = 30000;
public ZooKeeper zk;
private CountDownLatch countDownLatch = new CountDownLatch(1);
@Before
public void before() throws Exception {
// 创建一个 zookeeper 的连接实例
zk = new ZooKeeper(serverURL,timeout, new Watcher() {
public void process(WatchedEvent event) {
System.out.println(event.getState());
System.out.println(event.getType());
System.out.println(event.getPath());
}
});
countDownLatch.await();
System.out.println(zk.getState());
}
@After
public void after() throws Exception {
// 断开连接
System.out.println(zk.getState());
zk.close();
}
}
ZooKeeper 的构造函数 该构造函数包含3个入参 第一个是连接的字符串,改参数包含了连接的ip和端口号 第二个参数是连接时间 第三个参数是设置监听的实现,我们可以通过监听时间获得不同的信息从而采取不同的对策
/**
* public String create(final String path,byte[] data,List<ACL> acl,CreateMode createMode)
* throws KeeperException, InterruptedException
* @param path 节点的路径
* @param data 节点的初始数据
* @param acl 节点的ACL
* @param createMode 节点的创建模式,可以选择是否创建临时或序列化节
*/
@Test
public void test1() throws Exception {
// 使用 zookeeper 实例创建一个节点
String s = zk.create("/testzk/znode1", "testzk的第一个节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(s);
}
/**
* public byte[] getData(String path, boolean watch, Stat stat)
* throws KeeperException, InterruptedException
* @param path 节点的路劲
* @param watch 是否对此节点设置监听
* @param stat 节点的状态
*/
@Test
public void test2() throws Exception {
// 获得节点的数据
byte[] data = zk.getData("/testzk/znode1", false, null);
String s = new String(data);
System.out.println(s);
}
/**
* public List<String> getChildren(String path, boolean watch)
* throws KeeperException, InterruptedException
* @param path 节点的路劲
* @param watch 是否对此节点设置监听
*/
@Test
public void test3() throws Exception {
// 获取节点下的所有子节点
List<String> child = zk.getChildren("/testzk", false);
for(String s : child) {
System.out.println(s);
}
}
/**
* setData(final String path, byte[] data, int version)
* throws KeeperException, InterruptedException
* @param path 节点的路劲
* @param data 设置的节点数据
* @param version 匹配的版本
*/
@Test
public void test4() throws Exception {
// 修改节点的值
Stat stat = zk.setData("/testzk/znode1", "znode修改的值".getBytes(), -1);
System.out.println(stat);
}
/**
* public void delete(final String path, int version)
* throws InterruptedException, KeeperException
* @param path 要被删除的节点路劲
* @param version 节点的版本
*/
@Test
public void Test5() throws Exception {
// 删除节点
zk.delete("/testzk/znode", -1);
}
/**
* public Stat exists(String path, boolean watch)
* throws KeeperException, InterruptedException
* @param path 节点的路劲
* @param watch 是否设置监听
*/
@Test
public void test6() throws Exception {
// 获得节点的状态
Stat stat = zk.exists("/testzk/znode", false);
System.out.println(stat.getCtime());
}
设置监听
@Test
public void testx() throws Exception {
zk.getData("/testzk/znode1", true, null);
zk.setData("/testzk/znode1", "znode修改的值".getBytes(), -1);
}
获取节点信息的函数 getData 函数包含三个入参 第一个是路径,是指向所获取的节点的信息 第二个是监听,是bool类型的值,表示是否这只监听 第三个是Stat,一般返回的是一个字节数组