本文不会讲述zookeeper源码相关主要就是介绍一下,zookeeper在java的基本使用。
1. zookeeper是什么
他提供了这样一种树形数据结构供我们使用,每个节点是一个znode,我们可以增添修改删除znode从而达到我们的存储目的。
2. zookeeper使用环境准备
服务端:
下载安装 zkserver 后并启动
可参考 https://www.runoob.com/w3cnote/zookeeper-setup.html
客户端 :
IDEA
maven
3. 利用Curator操纵zookeeper
zookeeper的java客户端有好几个,这里我们选择dubbo在使用的这个客户端Curator进行介绍
3.1 curator环境准备
使用maven引入下边这个依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.3.0</version>
</dependency>
</dependencies>
3.2 使用curator
-
创建 CuratorFramework。
CuratorFramework client = CuratorFrameworkFactory.newClient( "127.0.0.1:2181", new ExponentialBackoffRetry(1000,3));
之后我们就可以使用client对zookeeper进行操作
-
创建znode
// 利用之前获得的 curatorFramework实例 client.start(); try { client.create().forPath("/zkTest/test1"); } catch (Exception e) { e.printStackTrace(); } finally { client.close(); }
我们可以打开zkCli查看是否真的创建成功
zkCli.sh ls /zkTest/test1
可以看到如下输出说明创建节点/zkTest/test1成功。
-
访问znode
我们用curator读取一下刚刚创建的节点是否创建成功String path = "/zkTest/test1"; client.start(); try { // 判断是否存在 System.out.println(client.checkExists().forPath(path) != null); // 获取节点数据 System.out.println(new String(client.getData().forPath(path))); // 获取子节点 System.out.println(client.getChildren().forPath(path)); } catch (Exception e) { e.printStackTrace(); } finally { client.close(); }
得到输出
可以看到这里节点对应的数据,是本机的ip,这是因为我们创建节点的时候并未设置节点对应的数据,那他默认就会使用本机ip作为节点对应的数据。 -
设置znode数据
那我们不妨修改一下znode的数据将其从本机地址改为 “hello zookeeper”String path = "/zkTest/test1"; client.start(); try { // 设置 client.setData().forPath(path,"hello zookeeper".getBytes(StandardCharsets.UTF_8)); // 读取 System.out.println(new String(client.getData().forPath(path))); } catch (Exception e) { e.printStackTrace(); } finally { client.close(); }
最后得到输出
说明修改成功 -
删除znode
String path = "/zkTest/test1"; client.start(); try { // 删除 client.delete().forPath(path); // 查看是否存在 System.out.println(client.checkExists().forPath(path) == null); } catch (Exception e) { e.printStackTrace(); } finally { client.close(); }
返回false说明确实删除成功