原生的api,比较的简单,但是对于Watcher的操作比较的复杂,所以我们可以使用Apache的Curator框架,官网地址:http://curator.apache.org/,通过apache的这个curator框架,操作zookeeper比较的简单方便,而且对于watcher的操作更加的简单方便了,支持链式编程。
环境搭建
pom.xml配置文件
<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>yellowcong</groupId>
<artifactId>day10_13</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>day10_13</name>
<url>http://maven.apache.org</url>
<!-- 配置国内比较快的 阿里云的Maven仓库 -->
<repositories>
<repository>
<id>aliyunmaven</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- zookeeper开发jar包 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<!-- curator框架 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.4.2</version>
</dependency>
<!--
Curator修使用的NodeCache的方式来监听节点的变更操作
NodeCacheLisener 监听节点新增、修改操作
PathChildrenCacheListener 监听子节点的新增、修改、删除操作
-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
案例
案例中,演示了Zookeeper原生的api的操作,节点的读取,删除、更新、获取子节点、异步删除更新等操作。这个Curator是支持链式编程的,使用起来比较的方便简洁
package com.yellowcong.zookeeper.curator;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.api.BackgroundCallback;
import org.apache.curator.framework.api.CuratorEvent;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
/**
* 创建日期:2017年10月14日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:
*/
public class CuratorDemo {
// private static final String CONNECT_PATH =
// "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
private static final String CONNECT_PATH = "192.168.66.110:2181,192.168.66.110:2182,192.168.66.110:2183";
// 超时时间
private static final int SESSION_TIME_OUT = 60000;
public static void main(String[] args) throws Exception {
//1、重试策略
//参数1:设定尝试的时间 ;参数2:和尝试的次数
RetryPolicy policy = new ExponentialBackoffRetry(5000, 10);
//重试连接的四中策略
// ExponentialBackoffRetry 尝试多次,一次多长时间
// RetryNTimes 尝试多次
// RetryOneTime 尝试一次
// RetryUntilElapsed 一直重试直到达到规定的时间
//2、设置工厂类,创建连接
CuratorFramework cf = CuratorFrameworkFactory.builder()
.connectString(CONNECT_PATH) //连接地址
//session超时,默认是6000ms
.sessionTimeoutMs(SESSION_TIME_OUT)
//默认超时连接时间为15s
.connectionTimeoutMs(15000)
.retryPolicy(policy)
.build();
//3、开启连接
cf.start();
//4、添加节点
//链式编程,可以迭代创建
//cf.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/curator/demo", "curator1".getBytes());
cf.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/curator/demo2","curator add".getBytes());
//5、获取节点数据
byte [] data = cf.getData().forPath("/curator/demo2");
System.out.println("6、获取节点数据\t"+new String(data));
//6、修改节点
Stat stat = cf.checkExists().forPath("/curator/demo2");
if(stat != null){
//修改节点
cf.setData().forPath("/curator/demo2","curator update".getBytes());
}
data = cf.getData().forPath("/curator/demo2");
System.out.println("6、修改后节点数据\t"+new String(data));
//7、删除节点 , 可以删除父类节点
cf.delete().deletingChildrenIfNeeded().forPath("/curator/demo2");
stat = cf.checkExists().forPath("/curator/demo2");
if(stat == null){
System.out.println("7、节点删除成功");
}
//8、异步的创建节点
//添加线程池,当异步多次调用的时候,我们可以任务放到线程池里面,不能一个任务就一个线程,这样几下就卡死了
ExecutorService pool = Executors.newCachedThreadPool();
cf.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).inBackground(new BackgroundCallback() {
@SuppressWarnings("incomplete-switch")
public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
switch (event.getType()) {
case CREATE:
System.out.println("节点创建");
break;
}
}
},pool).forPath("/curator/backgroud");
//线程停会,不然,里面 的节点创建 的watch事件没触发
Thread.sleep(5000);
//9、获取子类节点
List<String> childs = cf.getChildren().forPath("/curator");
for(String child:childs){
System.out.println("9、子节点\t"+child);
}
}
}