本案例创建的是一个springboot项目
步骤一:在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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.6.RELEASE</version><!--改成了2.0.6-->
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.qf</groupId>
<artifactId>zookeeper</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>zookeeper</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--zookeeper客户端-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.1</version>
</dependency>
<!--zkclient-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
步骤二:创建执行类
专门用于测试连接zookeeper对象的类: ConnectionZK
package com.qf.zookeeper;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.junit.Test;
import java.util.List;
public class ConnectionZK {
//这里是一个工具类方法,专门获得连接对象,用于调用各种方法
public static CuratorFramework getCf(){
//指定重试策略。每隔四秒重试一次,一共重试2次
RetryPolicy retryPolicy = new ExponentialBackoffRetry(4000, 2);//每隔四秒触发一次,重试两次
//连接zookeeper的客户端对象
CuratorFramework cf = CuratorFrameworkFactory.builder()
.connectString("192.168.22.131:2181,192.168.22.131:2182,192.168.22.131:2183")//连接zookeeper集群中的所有zookeeper
.connectionTimeoutMs(6000)//超时时间,6秒
.retryPolicy(retryPolicy)//设置超时处理策略
.build();
//开启连接
cf.start();
return cf;//返回zookeeper连接对象,用于节点和数据的创建
}
//连接zookeeper的测试类
@Test
public void createConn() throws Exception {
//指定重试策略。每隔四秒重试一次,一共重试2次
RetryPolicy retryPolicy = new ExponentialBackoffRetry(4000, 2);//每隔四秒触发一次,重试两次
//连接zookeeper的客户端对象
CuratorFramework cf = CuratorFrameworkFactory.builder()
.connectString("192.168.22.131:2181,192.168.22.131:2182,192.168.22.131:2183")//连接zookeeper集群中的所有zookeeper
.connectionTimeoutMs(6000)//超时时间,6秒
.retryPolicy(retryPolicy)//设置超时处理策略
.build();
//开启连接
cf.start();
//操作
List<String> znodes = cf.getChildren().forPath("/");//获取根节点下的所有子节点。等同于ls /
for (String znode : znodes) {
System.out.println("znode = " + znode);
}
}
}
专门用于测试创建持久节点和临时节点的类: CreateZK
package com.qf.zookeeper;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.junit.Test;
public class CreateZK {
//默认创建的是持久节点
@Test
public void createSingleZnode() throws Exception {
//获取连接对象
CuratorFramework cf = ConnectionZK.getCf();
//创建单级节点
cf.create().forPath("/java","我爱java,java使我快乐".getBytes());//第一个参数是节点,第二个是放在节点中的数据
System.out.println("OK!!!");
//释放资源
cf.close();
}
//创建临时节点测试
@Test
public void createOtherKindZnode() throws Exception {
//获取连接对象
CuratorFramework cf = ConnectionZK.getCf();
//创建临时节点
cf.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL)//PERSISTENT持久节点、PERSISTENT_SEQUENTIAL持久有序节点、EPHEMERAL临时节点、EPHEMERAL_SEQUENTIAL临时有序节点
.forPath("/temp", "我是临时节点!!".getBytes());//第一个参数是创建的节点的名称,第二个参数是存入节点的数据
System.out.println("OK!!!");
//释放资源
cf.close();//注意必须在这里打断点运行以debug模式才能看到临时节点信息,不然即使 ls /也没有数据
}
}
获取存储在zookeeper节点中的数据的类: getZk
package com.qf.zookeeper;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;
public class getZk{
//获取数据。这里只能获取到存的数据,不能获取很杂的详细信息
@Test
public void getData() throws Exception {
//获取客户端对象
CuratorFramework cf = ConnectionZK.getCf();
//获取存储的节点数据
byte[] bytes = cf.getData().forPath("/java");
String results = new String(bytes);//注意:用什么序列化的就用什么反序列化,因为之前存数据用的getbytes(),因此这里用的new String();
System.out.println("java节点中的results数据 = " + results);
}
//获取节点中数据的详情
@Test
public void getStat() throws Exception {
CuratorFramework cf = ConnectionZK.getCf();
Stat stat = cf.checkExists().forPath("/java");//先检查连接对象存不存在,再连接节点
//ctrl点击进入Stat可获取输出的对应的key详细信息
System.out.println("节点状态stat = " + stat);
//释放资源
cf.close();
}
}
修改节点中存的数据以及删除节点的类: ModifyZk
package com.qf.zookeeper;
import org.apache.curator.framework.CuratorFramework;
import org.junit.Test;
public class ModifyZk {
//修改节点下的数据
@Test
public void getStat() throws Exception {
//获取客户端对象
CuratorFramework cf = ConnectionZK.getCf();
//修改java节点下的数据
cf.setData().forPath("/java","java是一门好语言,能赚钱的东西".getBytes());
System.out.println("OK!!!!");
//释放资源
cf.close();
}
//删除节点下的数据
@Test
public void delete() throws Exception {
//获取客户端对象
CuratorFramework cf = ConnectionZK.getCf();
//删除java节点,delete只删除空节点的。rmr无论是空还是非空都删除
cf.delete().deletingChildrenIfNeeded().forPath("/java");
System.out.println("OK!!!!");
//释放资源
cf.close();
}
}
结构图: