这应该是目录
- 一、创建连接
- 1.1构造函数
- 1.2创建连接(封装)
- 二、节点操作
- 2.1创建节点create
- 语法
- 代码
- 2.2获取节点数据getData
- 语法
- 代码
- 2.3获取子节点getChildren
- 语法
- 代码
- 2.4修改节点的值setData
- 语法
- 代码
- 2.5删除delete
- 语法
- 代码
以下的代码只能作为基础的语法使用,为了简洁,我尽量使得每个功能区分开,代码内可能存在一些冗余,自行删除即可
一、创建连接
1.1构造函数
zookeeper的构造函数很多,具体区别建议查看源码
常用的构造函数如下
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException { this(connectString, sessionTimeout, watcher, false); }
String connectString:这是一个包含ZooKeeper服务器地址的连接字符串。通常,它是由逗号分隔的主机名和端口号对组成,例如 “host1:port1,host2:port2,host3:port3”
int sessionTimeout:这是会话超时的时间(以毫秒为单位)。ZooKeeper客户端和服务器之间的会话在指定的时间内如果没有收到任何心跳,则会话将过期。
Watcher watcher:这是一个实现了Watcher接口的实例,用于接收来自ZooKeeper的状态变化通知。
1.2创建连接(封装)
由于连接速度比较慢,因此使用CountDownLatch同步工具类,等待zookeeper客户端与服务端建立完成后,继续后续操作。
ZooKeeperFacotry.java
package com.wunaiieq;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.util.concurrent.CountDownLatch;
public class ZooKeeperFacotry {//连接超时时间private static final int SESSION_TIMEOUT = 5000;public static ZooKeeper create(String connectionString) throws Exception {final CountDownLatch connectionLatch = new CountDownLatch(1);//创建 ZooKeeper 对象ZooKeeper zooKeeper = new ZooKeeper(connectionString, SESSION_TIMEOUT,// 当 ZooKeeper 服务的状态变为 SyncConnected(同步连接已建立)时,process 方法会被调用。// 此时,它会调用 connectionLatch.countDown() 来减少 CountDownLatch 的计数,并打印出 "连接建立" 的信息。new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getType()== Event.EventType.None&& event.getState() == Watcher.Event.KeeperState.SyncConnected) {connectionLatch.countDown();System.out.println("success");}}});//在创建 ZooKeeper 对象之后,代码会打印出 "等待连接建立..." 的信息,并调用 connectionLatch.await() 来等待连接建立。// CountDownLatch 的 await 方法会阻塞当前线程,直到计数器的值变为 0。System.out.println("waiting...");connectionLatch.await();return zooKeeper;}}
主函数,这里没有设置太多的内容,关于节点操作请看后续
Main.java
package com.wunaiieq;
import org.apache.zookeeper.ZooKeeper;
public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//随便打印些内容查看状态System.out.println(zooKeeper.getSessionId());}
}
项目使用Maven进行打包,建议在服务器端运行
关于zookeeper的jar包必须保持和服务器端zookeeper版本一致
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wunaiieq</groupId><artifactId>zookeeper02</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.7.1</version></dependency></dependencies><build><plugins><plugin><!--声明--><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><!--具体配置--><configuration><archive><manifest><!--jar包的执行入口--><mainClass>com.wunaiieq.Main</mainClass></manifest></archive><descriptorRefs><!--描述符,此处为预定义的,表示创建一个包含项目所有依赖的可执行 JAR 文件;允许自定义生成jar文件内容--><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><!--执行配置--><executions><execution><!--执行配置ID,可修改--><id>make-assembly</id><!--执行的生命周期--><phase>package</phase><goals><!--执行的目标,single表示创建一个分发包--><goal>single</goal></goals></execution></executions></plugin></plugins></build>
</project>
二、节点操作
2.1创建节点create
语法
path:节点的全部路径
data:数据,要求必须是字节数组
acl:节点的权限
OPEN_ACL_UNSAFE:任何人任何操作
CREATOR_ALL_ACL:给与创建者的权限
READ_ACL_UNSAFE:允许任何人读取
createMode:节点类型
PERSISTENT:普通持久节点
PERSISTENT_SEQUENTIAL:顺序持久节点
EPHEMERAL:普通临时节点
EPHEMERAL_SEQUENTIAL:顺序临时节点
CONTAINER:容器节点
PERSISTENT_WITH_TTL:带有TTL的持久节点
PERSISTENT_SEQUENTIAL_WITH_TTL:带有TTL的持久顺序节点
代码
代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java
package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//节点不存在时,stat为空if (stat == null) {//创建节点try {String result = zooKeeper.create("/wunaiieq", "wunai".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);System.out.println("创建成功");} catch (Exception e) {e.printStackTrace();System.out.println("创建失败");}}else {System.out.println("节点存在,创建失败");}}
}
2.2获取节点数据getData
语法
path:路径
watch:监听器。这里表示是否使用,如果使用需要填入监听器对象
stat:存储节点属性,如果输入一个stat对象,那么执行后,这个对象会获取到这个节点的相关信息
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
注意2,4两个方法是异步的getdata
代码
代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java
package com.wunaiieq;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);if (stat != null) {Stat stat1 =new Stat();byte[] data = zooKeeper.getData("/wunaiieq", false, stat1);String res =new String(data);System.out.println(res);System.out.println(stat1);}}
}
2.3获取子节点getChildren
语法
path:路径
watch:监听器。这里表示是否使用,如果使用需要填入监听器对象
stat:存储节点属性,如果输入一个stat对象,那么执行后,这个对象会获取到这个节点的相关信息
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
下面4个为异步执行的,上面4个将获取所有子节点的名称,在获取到名称后,可以使用2.2的方法获取每个节点的内容
代码
代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java
package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;import java.util.List;public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//获取子节点数据//获取所有子节点List<String> childrenList = zooKeeper.getChildren("/", null);for(String child:childrenList){System.out.println(child);Stat stat1 =new Stat();String path = "/"+child;byte[] data = zooKeeper.getData(path, false, stat1);String res = new String(data);System.out.println(res);System.out.println(stat1);}}
}
2.4修改节点的值setData
语法
path:节点的路径
data:数据,要求必须是字节数组
version:版本号,若不知道具体的值,写-1即可,最终结果+1
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
和上述类似,第二个为异步执行的函数
在hadoop生态圈中,大部分框架的数据内容都附带一个版本号的信息,如果想对此节点的数据进行更新,一般都是 新数据 + 更高的版本号
代码
代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java
package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.util.List;
public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//修改节点值Stat stat3 = null;stat3 = zooKeeper.setData("/wunaiieq", "20241010".getBytes(), -1);//查看节点的内容byte[] data = zooKeeper.getData("/wunaiieq", false, null);String res = new String(data);System.out.println(res);}
}
2.5删除delete
语法
path:节点的路径
version:版本号,若不知道具体的值,写-1即可,表示无论版本,直接删除
cb:回调接口,当ZooKeeper完成获取数据的操作后,它会通过这个回调接口将结果返回给调用者
ctx:上下文对象,它可以包含与请求相关的任何额外信息
和上述类似,第二个为异步执行的函数
代码
代码实现需要Main.java,ZookeeperFactory.java,pom.xml其中后两者接上述,没有修改,Main.java如下
Main.java
package com.wunaiieq;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.util.List;
public class Main {//设置连接private final static String CLUSTER_CONNECT_STR = "192.168.80.111:2181,192.168.80.112:2181,192.168.80.113:2181";public static void main(String[] args) throws Exception {//创建zookeeper对象,这里使用的是封装好的内容ZooKeeper zooKeeper = ZooKeeperFactory.create(CLUSTER_CONNECT_STR);//输出状态System.out.println(zooKeeper.getState());//stat是zookeeper中自带的一个类,用于描述znode的相关信息Stat stat = zooKeeper.exists("/wunaiieq", false);//删除//判断存在if(stat != null){System.out.println("节点存在");zooKeeper.delete("/wunaiieq",-1);System.out.println("删除成功");}else {System.out.println("节点不存在");}}
}