目录
ZooKeeper API 简介
ZooKeeper API 共包含 5 个包,分别为:
org.apache.zookeeper
org.apache.zookeeper.data
org.apache.zookeeper.server
org.apache.zookeeper.server.quorum
org.apache.zookeeper.server.upgrade
其中 org.apache.zookeeper 包含 ZooKeeper 类,它我们编程时最常用的类文件。
这个类是 ZooKeeper 客户端库的主要类文件。如果要使用 ZooKeeper 服务,应用程序首先必须创建一个Zookeeper 实例,这时就需要使用此类。一旦客户端和 ZooKeeper 服务建立起连接, ZooKeeper 系统将会分配给此连接回话一个 ID 值,并且客户端将会周期地向服务器发送心跳来维持会话的连接。只要连接有效,客户端就可以调用 ZooKeeper API 来做相应的处理。
它提供了所示几类主要方法 , :
功能 | 描述 |
create | 在本地目录树中创建一个节点 |
delete | 删除一个节点 |
exists | 测试本地是否存在目标节点 |
get/set data | 从目标节点上读取 / 写数据 |
get/set ACL | 获取 / 设置目标节点访问控制列表信息 |
get children | 检索一个子节点上的列表 |
sync | 等待要被传送的数据 |
JAVA API简单使用
引入maven坐标
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
配置Zookeeper对象
// zookeeper的服务器地址,配置conf是用主机名,这里一样
private String connectString ="zek00:2181,zek01:2181,zek02:2181";
// 连接超时时间
private int sessionTimeout = 2000;
private ZooKeeper zk = null;
/**
* 设置zookeeper对象
* @throws IOException
*/
@Before
public void setZookeeper() throws IOException {
zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
/**
* 事件触发的回调方法
*/
@Override
public void process(WatchedEvent event) {
}
});
System.out.println("---"+zk);
}
常用API操作
/**
* create 方法参数
* 第一个参数 路径
* 第二个参数 值 bytes
* 第三个参数 对节点的访问控制
* 第四个参数 节点的类型 短暂 永久 序号
* @throws KeeperException
* @throws InterruptedException
*/
@Test
public void create() throws KeeperException, InterruptedException {
String path = zk.create("/app3", "123".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(path);
}
/**
* 判断节点是否存在
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void exist() throws KeeperException, InterruptedException{
// 设置为 true 会调用 zk中的监听器
Stat stat = zk.exists("/app1", true);
if(stat!=null){
System.out.println("存在。。。。"+stat.getDataLength());
}else{
System.out.println("不存在。。。");
}
}
/**
* 获取子节点
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void getChilren() throws KeeperException, InterruptedException{
List<String> list = zk.getChildren("/", true);
for (String s : list) {
System.out.println(s);
}
}
/**
* 获取节点的内容
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void getData() throws KeeperException, InterruptedException{
byte[] b = zk.getData("/app1", false, null );
System.out.println(new String(b));
}
/**
* 修改节点内容
* version -1 自动维护
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void setData() throws KeeperException, InterruptedException{
Stat s = zk.setData("/app1", "test".getBytes(), -1);
}
/**
* 删除节点
* 非空节点删除不掉
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void deleteNode() throws InterruptedException, KeeperException{
zk.delete("/app1", -1);
}
监听器的使用
@Before
public static void setUpBeforeClass() throws Exception {
zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
/**
* 监听器
*/
@Override
public void process(WatchedEvent event) {
System.out.println("事件触发...");
}
});
}
/**
* 获取子节点
* getChildren(path,watch?)监听的事件是:节点下的子节点增减变化事件
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void getChilren() throws KeeperException, InterruptedException{
List<String> list = zk.getChildren("/", new Watcher() {
@Override
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println("监控节点下的子节点被改变..."+event.getPath());
}
});
for (String s : list) {
System.out.println(s);
}
Thread.sleep(Long.MAX_VALUE);
}
/**
* 获取节点的内容
* getData(path,watch?)监听的事件是:节点数据变化事件
* @throws InterruptedException
* @throws KeeperException
*/
@Test
public void getData() throws KeeperException, InterruptedException{
byte[] b = zk.getData("/app1", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("--数据改变了--");
}
}, null );
System.out.println(new String(b));
Thread.sleep(Long.MAX_VALUE);
}