您的位置:首页 > 编程语言 > Java开发

Zookeeper实践(三)java api 使用

2016-11-18 17:12 323 查看
Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题。它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,在本节实践中,我们将会通过java工程来看Zookeeper
的操作接口和简单使用情况。

一、目标

建立java工程,使用zookeeper的api 对其进行简单操作。

了解接口的分类和情况

二、环境

在虚拟机192.168.136.144上部署了zookeeper,伪分布式方式。

在本机192.168.136.1 eclipse环境下建立 java工程

三、zookeeper java api工程情况

1)依赖库



2) 代码

package com.solostudy.zookeeper.api;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class CliApiDemo implements Watcher {
public final String CLIENT_PORT = "2181";
public final String ZK_IP = "192.168.136.144";
public final Integer CONNECTION_TIMEOUT = 1000;
public ZooKeeper zk = null;
private CountDownLatch connectedSemaphore = new CountDownLatch(1);

/**
* 继承了watcher,需要实现process接口,这个接口类似一个回调函数 收到来自Server的Watcher通知后的处理。
*/
@Override
public void process(WatchedEvent event) {
//System.out.println("收到事件通知:" + event.getState() + "\n");
if (KeeperState.SyncConnected == event.getState()) {
connectedSemaphore.countDown();
}
}

/**
* zookeeper连接方法,成功返回true,否则返回false
*
*/
public boolean ZK_con() {

String con_string = ZK_IP + ":" + CLIENT_PORT;

try {
zk = new ZooKeeper(con_string, CONNECTION_TIMEOUT, this);
//
connectedSemaphore.await();
} catch (InterruptedException e) {
System.out.println("连接创建失败,发生 InterruptedException");
e.printStackTrace();
return false;
} catch (IOException e) {
System.out.println("连接创建失败,发生 IOException");
e.printStackTrace();
return false;
}

return true;
}

/**
* zookeeper 创建目录或者子目录,成功返回true,否则返回false
*
*/
public boolean ZK_create(String strPath, String strDir) {
try {
zk.create(strPath, strDir.getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;

} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}

return true;
}

/**
* zookeeper连接方法,成功返回true,否则返回false
*
*/
public String ZK_getNode(String strPath) {
String result = "";
try {
result = new String(zk.getData(strPath, false, null));
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}

public List ZK_getChild(String strPath) {
List<String> resultList = null;
try {
resultList = zk.getChildren(strPath, true);
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultList;
}

// 设置节点数据
public boolean ZK_setNodeDate(String strPath, String strNewData) {

try {
zk.setData(strPath, strNewData.getBytes(), -1);
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}

// 判断节点是否存在
public boolean ZK_exists(String strPath) {

try {
zk.exists(strPath, true);
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}

// 删除节点
public boolean ZK_delete(String strPath) {

try {
zk.delete(strPath, -1);
} catch (KeeperException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}

// 删除节点
public boolean ZK_close() {

try {
zk.close();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
return true;
}

public static void main(String[] args) {

// 创建一个CliApiDemo对象
CliApiDemo myCliApiDemo = new CliApiDemo();

// 创建一个与服务器的连接
if (myCliApiDemo.ZK_con()) {
System.out.println("ZK  connect succesfully!");
} else {
System.out.println("ZK  connect failed!");
System.exit(0);
}

// 创建一个目录节点
if (myCliApiDemo.ZK_create("/MyPath", "MyPath"))
System.out.println(myCliApiDemo.ZK_getNode("/MyPath"));
else
System.out.println("Create Node  failed!!!");

// 创建一个子目录节点
if (myCliApiDemo.ZK_create("/MyPath/MyChildPath1",
"child-1"))
System.out.println(myCliApiDemo.ZK_getChild("/MyPath"));
else
System.out.println("Create children Node  failed!!!");

// 修改子目录节点数据
if (myCliApiDemo.ZK_setNodeDate("/MyPath/MyChildPath1",
"child-1"))
System.out.println("目录节点状态:["
+ myCliApiDemo.ZK_exists("/MyPath") + "]");
else
System.out.println("Set New Data  failed!!!");

// 创建另外一个子目录节点
if (myCliApiDemo.ZK_create("/MyPath/MyChildPath2",
"child-2"))
System.out.println(myCliApiDemo
.ZK_getChild("/MyPath"));
else
System.out.println("Create children Node  failed!!!");

// 删除子目录节点
myCliApiDemo.ZK_delete("/MyPath/MyChildPath2");
myCliApiDemo.ZK_delete("/MyPath/MyChildPath1");
// 删除父目录节点
myCliApiDemo.ZK_delete("/MyPath");
// 关闭连接
myCliApiDemo.ZK_close();

}

}
执行结果如下图:



四、zookeeper常用接口列表

客户端要连接 Zookeeper 服务器可以通过创建 org.apache.zookeeper. ZooKeeper 的一个实例对象,然后调用这个类提供的接口来和服务器交互。这些接口如下表所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: