Zookeeper
原生API的实现
- 连接Zookeeper
/**
* @Author: zxx
* @Date: 2020/3/30 20:43
* @Description: 连接zookeeper
*/
public class ZKConnection {
@Test
public void zkconnect() throws IOException, InterruptedException {
String ip="192.168.21.141:2181";
// 计数器对象
final CountDownLatch countDownLatch=new CountDownLatch(1);
// 连接对象
ZooKeeper zooKeeper=new ZooKeeper(ip, 5000, new Watcher() {
public void process(WatchedEvent watchedEvent) {
try {
//EventType = None时
if (watchedEvent.getType() == Watcher.Event.EventType.None) {
if (watchedEvent.getState() == Watcher.Event.KeeperState.SyncConnected) {
System.out.println("连接成功");
countDownLatch.countDown();
} else if (watchedEvent.getState() == Watcher.Event.KeeperState.Disconnected) {
System.out.println("断开连接");
} else if (watchedEvent.getState() == Watcher.Event.KeeperState.Expired) {
System.out.println("会话超时");
} else if (watchedEvent.getState() == Watcher.Event.KeeperState.AuthFailed) {
System.out.println("认证失败");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
countDownLatch.await();
zooKeeper.close();
}
}
- 创建节点
// 同步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
// 异步方式
create(String path, byte[] data, List<ACL> acl, CreateMode createMode, AsyncCallback.StringCallback callBack,Object ctx)
path - znode路径。例如,/node1 /node1/node11
data - 要存储在指定znode路径中的数据
acl - 要创建的节点的访问控制列表。zookeeper API提供了一个静态接口
ZooDefs.Ids 来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE 返回打开znode的acl列表。 createMode - 节点的类型,这是一个枚举。
callBack-异步回调接口
ctx-传递上下文参数
/**
* @Author: zxx
* @Date: 2020/3/30 20:49
* @Description: 新增节点
*/
public class ZKCreate {
private String IP = "192.168.21.141:2181";
public static ZooKeeper zooKeeper;
//连接zookeeper
@Before
public void before() throws InterruptedException, IOException {
final CountDownLatch countDownLatch=new CountDownLatch(1);
zooKeeper = new ZooKeeper(IP, 6000, new Watcher() {
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState() == Event.KeeperState.SyncConnected){
countDownLatch.countDown();
}
System.out.println("path=" + watchedEvent.getPath());
System.out.println("eventType=" + watchedEvent.getType());
}
});
countDownLatch.await();
}
@After
public void after() throws InterruptedException {
zooKeeper.close();
}
@Test
public void zkCreate1() throws KeeperException, InterruptedException {
zooKeeper.create("/node1", "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
@Test
public void zkCreate2() throws KeeperException, InterruptedException {
zooKeeper.create("/node1", "data".getBytes(), ZooDefs.Ids.READ_ACL_UNSAFE,CreateMode.PERSISTENT);
}
@Test
public void zkCreate3() throws KeeperException, InterruptedException {
List<ACL> acls = new ArrayList<ACL>();
//授权模式和对象
Id id = new Id("world", "anyone");
acls.add(new ACL(ZooDefs.Perms.READ, id));
acls.add(new ACL(ZooDefs.Perms.CREATE, id));
zooKeeper.create("/node1", "data".getBytes(), acls,CreateMode.PERSISTENT);
}
@Test
public void zkCreate4() throws KeeperException, InterruptedException {
//auth授权
zooKeeper.addAuthInfo("digest", "username:123456".getBytes());
zooKeeper.create("/node1", "data".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);
}
@Test
public void zkCreate5() throws Exception {
// 持久化顺序节点
// Ids.OPEN_ACL_UNSAFE world:anyone:cdrwa
String result = zooKeeper.create("/create/node1", "node1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(result);
}
}
- 更新节点
// 同步方式
setData(String path, byte[] data, int version)
// 异步方式
setData(String path, byte[] data, int version,AsyncCallback.StatCallback callBack, Object ctx)
path- znode路径
data - 要存储在指定znode路径中的数据。
version- znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本号。
callBack-异步回调接口 ctx-传递上下文参数
/**
* @Author: zxx
* @Date: 2020/3/30 20:49
* @Description: 更新节点
*/
public class ZKUpdate {
private String IP = "192.168.21.141:2181";
public static ZooKeeper zooKeeper;
//连接zookeeper
@Before
public void before() throws InterruptedException, IOException {
final CountDownLatch countDownLatch=new CountDownLatch(1);
zooKeeper = new ZooKeeper(IP, 6000, new Watcher() {
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState() == Event.KeeperState.SyncConnected){
countDownLatch.countDown();
}
System.out.println("path=" + watchedEvent.getPath());
System.out.println("eventType=" + watchedEvent.getType());
}
});
countDownLatch.await();
}
@After
public void after() throws InterruptedException {
zooKeeper.close();
}
@Test
public void zkCreate1() throws KeeperException, InterruptedException {
// arg1:节点的路径
// arg2:节点的数据
// arg3:版本号 -1代表版本号不作为修改条件
Stat stat=zooKeeper.setData("/node1","nodedata".getBytes(),2);
// 节点的版本号
System.out.println(stat.getVersion());
// 节点的创建时间
System.out.println(stat.getCtime());
}
@Test
public void zkCreate2() throws KeeperException, InterruptedException {
// 异步方式修改节点
zooKeeper.setData("/node2", "node2".getBytes(), -1, new AsyncCallback.StatCallback() {
public void processResult(int rc, String path, Object ctx, Stat stat) {
// 0 代表修改成功
System.out.println(rc);
// 修改节点的路径
System.out.println(path);
// 上线文的参数对象
System.out.println(ctx);
// 版本信息
System.out.println(stat.getVersion());
} },"I am Context");
Thread.sleep(50000);
System.out.println("结束");
}
}
- 删除节点
// 同步方式
delete(String path, int version)
// 异步方式
delete(String path, int version, AsyncCallback.VoidCallback callBack, Object ctx)
path - znode路径。
version - znode的当前版本
callBack-异步回调接口
ctx-传递上下文参数
public class ZKDelete {
String IP = "192.168.21.141:2181";
ZooKeeper zooKeeper;
@Before
public void before() throws Exception {
final CountDownLatch countDownLatch = new CountDownLatch(1);
// arg1:zookeeper服务器的ip地址和端口号
// arg2:连接的超时时间 以毫秒为单位
// arg3:监听器对象
zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("连接创建成功!");
countDownLatch.countDown();
}
}
});
// 使主线程阻塞等待
countDownLatch.await();
}
@After
public void after() throws Exception {
zooKeeper.close();
}
@Test
public void delete1() throws Exception {
// arg1:删除节点的节点路径
// arg2:数据版本信息 -1代表删除节点时不考虑版本信息
zooKeeper.delete("/delete/node1",-1);
}
@Test
public void delete2() throws Exception {
// 异步使用方式
zooKeeper.delete("/delete/node2", -1, new AsyncCallback.VoidCallback() {
public void processResult(int rc, String path, Object ctx) {
// 0代表删除成功
System.out.println(rc);
// 节点的路径
System.out.println(path);
// 上下文参数对象
System.out.println(ctx);
}
},"I am Context");
Thread.sleep(10000);
System.out.println("结束");
}
}
- 查看节点
// 同步方式
getData(String path, boolean b, Stat stat)
// 异步方式
getData(String path, boolean b,AsyncCallback.DataCallback callBack, Object ctx)
path - znode路径。
b- 是否使用连接对象中注册的监视器。
stat - 返回znode的元数据。
callBack-异步回调接口
ctx-传递上下文参数
public class ZKGet {
String IP = "192.168.21.141:2181";
ZooKeeper zooKeeper;
@Before
public void before() throws Exception {
final CountDownLatch countDownLatch = new CountDownLatch(1);
// arg1:zookeeper服务器的ip地址和端口号
// arg2:连接的超时时间 以毫秒为单位
// arg3:监听器对象
zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("连接创建成功!");
countDownLatch.countDown();
}
}
});
// 使主线程阻塞等待
countDownLatch.await();
}
@After
public void after() throws Exception {
zooKeeper.close();
}
@Test
public void get1() throws Exception {
// arg1:节点的路径
// arg3:读取节点属性的对象
Stat stat=new Stat();
byte [] bys=zooKeeper.getData("/get/node1",false,stat);
// 打印数据
System.out.println(new String(bys));
// 版本信息
System.out.println(stat.getVersion());
}
@Test
public void get2() throws Exception {
//异步方式
zooKeeper.getData("/get/node1", false, new AsyncCallback.DataCallback() {
public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
// 0代表读取成功
System.out.println(rc);
// 节点的路径
System.out.println(path);
// 上下文参数对象
System.out.println(ctx);
// 数据
System.out.println(new String(data));
// 属性对象
System.out.println(stat.getVersion());
}
},"I am Context");
Thread.sleep(10000);
System.out.println("结束");
}
}
- 查看子节点
// 同步方式
getChildren(String path, boolean b)
// 异步方式
getChildren(String path, boolean b,AsyncCallback.ChildrenCallback callBack,Object ctx)
path - Znode路径。
b- 是否使用连接对象中注册的监视器。
callBack - 异步回调接口。
ctx-传递上下文参数
public class ZKGetChid {
String IP = "192.168.21.141:2181";
ZooKeeper zooKeeper;
@Before
public void before() throws Exception {
final CountDownLatch countDownLatch = new CountDownLatch(1);
// arg1:zookeeper服务器的ip地址和端口号
// arg2:连接的超时时间 以毫秒为单位
// arg3:监听器对象
zooKeeper = new ZooKeeper(IP, 5000, new Watcher() {
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("连接创建成功!");
countDownLatch.countDown();
}
}
});
// 使主线程阻塞等待
countDownLatch.await();
}
@After
public void after() throws Exception {
zooKeeper.close();
}
@Test
public void get1() throws Exception {
// arg1:节点的路径
List<String> list = zooKeeper.getChildren("/get", false);
for (String str : list) {
System.out.println(str);
}
}
@Test
public void get2() throws Exception {
// 异步用法
zooKeeper.getChildren("/get", false, new AsyncCallback.ChildrenCallback() {
public void processResult(int rc, String path, Object ctx, List<String> children) {
// 0代表读取成功
System.out.println(rc);
// 节点的路径
System.out.println(path);
// 上下文参数对象
System.out.println(ctx);
// 子节点信息
for (String str : children) {
System.out.println(str);
}
}
},"I am Context");
Thread.sleep(10000);
System.out.println("结束");
}
}