目录
1、将服务器的防火墙关闭
2、启动zookeeper服务器以及客户端
3、通过idea创建maven工程
4、pom.xml配置如下
5、配置文件
6、节点增删改查
6.1、连接zookeeper服务
6.2 释放资源
6.3 创建节点
6.4 查询节点
6.5 修改节点
6.6 删除节点
使用SecureCRT工具连接服务器,然后关闭防火墙:
systemctl stop firewalld
--进入到zookeeper安装目录下的bin目录,启动zookeeper服务
./zkServer.sh start
--重新克隆一份会话,然后同样进入zookeeper安装目录下的bin目录,启动客户端
./zkCli.sh (在本机安装的客户端可以直接使用该操作)
./zkCli.sh -server ip地址:2181(如果客户端不和服务在同一机器上,需要加上服务的ip地址)
结构如下所示:
4.0.0
com.flyrain.zk
curator-zk
1.0-SNAPSHOT
junit
junit
4.10
test
org.apache.curator
curator-framework
4.0.0
org.apache.curator
curator-recipes
4.0.0
org.slf4j
slf4j-api
1.7.21
org.slf4j
slf4j-log4j12
1.7.21
org.apache.maven.plugins
maven-compiler-plugin
3.1
1.8
配置文件下只有日志文件,内容比较简单,如下所示
log4j.rootLogger=off,stdout
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%d{yyyy-MM-dd HH/:mm/:ss}]%-5p %c(line/:%L) %x-%m%n
public class CuratorTest {
private CuratorFramework client;
@Test
public void testConZookeeper(){
//第一种连接策略CuratorFrameworkFactory.newClient()
/**
* Create a new client
*
* @param connectString 连接字符串 zk server的ip地址和端口,如果集群用逗号隔开 "192.168.117.128:2181"
* @param sessionTimeoutMs 会话超时时间 单位毫秒
* @param connectionTimeoutMs 连接超时时间 单位毫秒
* @param retryPolicy 重试策略
* @return client
*/
//重试策略
RetryPolicy retry = new ExponentialBackoffRetry(3000, 3);
/*client = CuratorFrameworkFactory.newClient("192.168.117.128:2181", 60 * 1000, 15 * 1000, retry);
//启动服务
client.start();*/
//第二种使用CuratorFrameworkFactory.builder()链式编程方式
//namespace()设置名称空间根目录,以后不用每次都写前面
client = CuratorFrameworkFactory.builder()
.connectString("192.168.117.128:2181")
.sessionTimeoutMs(90 * 1000)
.connectionTimeoutMs(15 * 1000)
.retryPolicy(retry)
.namespace("flyrain")
.build();
//开启连接
client.start();
}
}
如果不报错,则说明连接成功,然后需要对节点进行操作,我们需在执行其他方法时都要先执行上述连接服务操作,将@Test修改为@Before即可,然后连接服务后,我们也需要释放资源,其代码如下:
//释放资源
@After
public void closeCurator(){
if(client != null){
client.close();
}
}
/**
* 创建节点:create 持久 临时 顺序 数据
* 1、基本创建 :create().forPath("")
* 2.创建带数据的节点 :create().forPath("",data)
* 3.设置节点类型:create().withMode().forPath("",data)
* 4.创建多级节点 /app1/p1 create().creatingParentsIfNeeded().forPath("",data)
*/
@Test
public void createNode(){
//1.基本创建 ,节点为/flyrain/app1, flyrain作为根节点
//如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
try {
String path = client.create().forPath("/flyrain");
System.out.println("path : "+path);
} catch (Exception e) {
e.printStackTrace();
}
}
//2.创建带数据的节点
@Test
public void testNodeWithData(){
try {
String path = client.create().forPath("/app2", "nihao".getBytes());
System.out.println("path : "+path); ///app2
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* PERSITENT 持久化节点
* EPHEMERAL 临时节点:-e
* PERSISTENT_SEQUENTIAL :持久化顺序节点: -s
* EPHEMERAL_SEQUENTIAL: 临时顺序节点:-es
*/
//3.创建节点类型
@Test
public void testNodeType(){
try {
String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
System.out.println("path : "+path); ///app3
} catch (Exception e) {
e.printStackTrace();
}
}
//4.创建多级节点
@Test
public void testMoreNode(){
//creatingParentsIfNeeded :如果父节点不存在,则创建
try {
String path = client.create().creatingParentsIfNeeded().forPath("/app4/p1");
System.out.println("path : "+path); ///app4/p1
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 查询节点
* 1.查询数据 :get : getData().forPath()
* 2.查询子节点:ls : getChildren().forPath()
* 3.查询节点状态信息 : ls -s :getData().storingStatIn(状态对象).forPath()
*/
@Test
public void testQueryData(){
try {
byte[] data = client.getData().forPath("/app2");
System.out.println("data : "+new String(data));
} catch (Exception e) {
e.printStackTrace();
}
}
//查询子节点
@Test
public void testQueryChildNode(){
try {
List list = client.getChildren().forPath("/");
System.out.println(" list "+list);
} catch (Exception e) {
e.printStackTrace();
}
}
//查询子节点状态信息
@Test
public void testChildStatus(){
Stat stat = new Stat();
System.out.println("stat1 : "+stat);
try {
byte[] data = client.getData().storingStatIn(stat).forPath("/app2");
/**
* []cZxid = 0x8b
* ctime = Thu Oct 14 16:57:52 CST 2021
* mZxid = 0x8b
* mtime = Thu Oct 14 16:57:52 CST 2021
* pZxid = 0x8b
* cversion = 0
* dataVersion = 0
* aclVersion = 0
* ephemeralOwner = 0x0
* dataLength = 5
* numChildren = 0
*/
System.out.println("stat2 : "+stat.getCtime());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 修改节点
* 1、基本数据修改: setData().forPath()
* 2、根据版本修改:setData().withVersion().forPath()
* version是通过查询出来的,目的是为了不让其他客户端或线程干扰我
*/
@Test
public void testUpdataBaseData(){
try {
client.setData().forPath("/app2", "wobuhao".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
//根据版本修改
@Test
public void testUpdataDataByVersion(){
Stat stat = new Stat();
//查询节点状态信息:
try {
client.getData().storingStatIn(stat).forPath("/app2");
//查询版本信息
int version = stat.getVersion();
client.setData().withVersion(version).forPath("/app2", "随遇而安".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 删除节点:delete deteleall
* 1、删除单个节点:delete().forPath("/app2")
* 2、删除带子节点的节点:delete().deletingChildredIfNeeded().forPath("/app2")
* 3、必须成功的删除:为了防止网络抖动。本质就是重试
* client().delete().guaranteed().forPath("/app2")
* 4、回调:inBackground
*/
//删除单个节点
@Test
public void testDeleteOneNode(){
try {
//app3下无子节点
client.delete().forPath("/app3");
} catch (Exception e) {
e.printStackTrace();
}
}
//删除带有子节点的节点
@Test
public void testDeleteNodeWithChildNode(){
try {
//app4节点下还有p1子节点
client.delete().deletingChildrenIfNeeded().forPath("/app4");
} catch (Exception e) {
e.printStackTrace();
}
}
//必须删除成功
@Test
public void testDeleteNeed(){
try {
//flyrain根节点下还有flryain子节点
client.delete().guaranteed().forPath("/flyrain");
} catch (Exception e) {
e.printStackTrace();
}
}
//回调
@Test
public void testCallBack(){
try {
client.delete().guaranteed().inBackground(new BackgroundCallback() {
@Override
public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
System.out.println("我被删除了...");
System.out.println(event);
}
}).forPath("/app2");
} catch (Exception e) {
e.printStackTrace();
}
}
以上就是节点的增删改查操作,我的zookeeper版本是3.5.6版本。
路漫漫其修远兮,吾将上下而求索,希望此篇文章对大家有所帮助......