本文为原创文章,转载请注明出处,谢谢

Zookeeper原生API使用

1、jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中

  

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>

2、创建zookeeper连接

  ZooKeeper(java.lang.String connectString, int sessionTimeout, org.apache.zookeeper.Watcher watcher)

    • connectString:zookeeper服务地址,例如“192.168.117.128:2181”
    • sessionTimeout :超时时间,单位为毫秒
    • watcher:实现org.apache.zookeeper.Watcher接口的实现类,需实现process(WatchedEvent watchedEvent) 方法

  ZooKeeper zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new MyWatcher());

示例代码:

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException; /**
*
* zookeeper连接
*/
public class CreateSession implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
System.out.println("做业务!");
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSession());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

  ps:此处没有新创建新的java类实现Watcher,而是直接在本类中实现Watcher接口并重写process方法

3、同步创建

  create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl, org.apache.zookeeper.CreateMode createMode)

    • path:创建节点路径,需保证父节点已存在
    • data:节点数据
    • acl:权限列表
      • 提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE

        • OPEN_ACL_UNSAFE:完全开放
        • CREATOR_ALL_ACL:创建该znode的连接拥有所有权限
        • READ_ACL_UNSAFE:所有的客户端都可读
      • 自定义权限  
        ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
        ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
        new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass")));
      • session设置权限 
        zk.addAuthInfo("digest", "id:pass".getBytes());  
    • createMode:节点类型
      • PERSISTENT:持久化节点
      • PERSISTENT_SEQUENTIAL:持久化有序节点
      • EPHEMERAL:临时节点(连接断开自动删除)
      • EPHEMERAL_SEQUENTIAL:临时有序节点(连接断开自动删除)

示例代码:  

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider; import java.io.IOException;
import java.security.NoSuchAlgorithmException; /**
* 创建节点(同步)
* Created by scot on 2016/6/8.
*/
public class CreateSessionSync implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
try {
if(null != zooKeeper.exists("/note_scot/note_scot_a",false)) {
System.out.println("/note_scot/note_scot_a 节点已存在");
return;
}
String path = zooKeeper.create("/note_scot/note_scot_a","aa".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); /*权限相关
try {
ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass")));
zooKeeper.addAuthInfo("digest", "id:pass".getBytes()); 
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}*/ System.out.println("zookeeper return:" + path);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSessionSync());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

4、异步创建

  create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl,

      org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.AsyncCallback.StringCallback cb, java.lang.Object ctx)

    • StringCallback cb:回调接口,执行创建操作后,结果以及数据发送到此接口的实现类中
    • Object ctx:自定义回调数据,在回调实现类可以获取此数据

示例代码:

import org.apache.zookeeper.*;

import java.io.IOException;

/**
* 创建节点(异步)
* Created by scot on 2016/6/8.
*/
public class CreateSessionASync implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
zooKeeper.create("/note_scot/note_scot_b","aa".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL,new IStringCallBack(),"testAsync");
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSessionASync());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} static class IStringCallBack implements AsyncCallback.StringCallback { @Override
public void processResult(int i, String s, Object o, String s2) {
System.out.println("i="+i);//创建成功返回0
System.out.println("s="+s);//自定义节点名称
System.out.println("o="+o);//自定义回调数据
System.out.println("s2="+s2);//最终节点名称(顺序节点最终名称与自定义名称不同) }
}
}

常用方法列表:

String create(final String path, byte data[], List acl, CreateMode createMode)

参数: 路径、 znode内容,ACL(访问控制列表)、 znode创建类型;

用途:创建znode节点

void delete(final String path, int version)

参数: 路径、版本号;如果版本号与znode的版本号不一致,将无法删除,是一种乐观加锁机制;如果将版本号设置为-1,不会去检测版本,直接删除;

用途:删除节点

Stat exists(final String path, Watcher watcher)

参数: 路径、Watcher(监视器);当这个znode节点被改变时,将会触发当前Watcher

用途:判断znode节点是否存在

Stat exists(String path, boolean watch)

参数: 路径、并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher;

判断znode节点是否存在

Stat setData(final String path, byte data[], int version)

参数: 路径、数据、版本号;如果为-1,跳过版本检查

用途:设置znode上的数据

byte[] getData(final String path, Watcher watcher, Stat stat)

参数: 路径、监视器、数据版本等信息

用途:获取znode上的数据

List getChildren(final String path, Watcher watcher)

参数: 路径、监视器;该方法有多个重载

用途:获取节点下的所有子节点

下一节:2.2ZkClient使用

(原) 2.1 Zookeeper原生API使用的更多相关文章

  1. Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话

    一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...

  2. zookeeper原生API做java客户端

    简介 本文是使用apache提供的原生api做zookeeper客户端 jar包 zookeeper-3.4.5.jar   Demo package bjsxt.zookeeper.base; im ...

  3. ZooKeeper 原生API操作

    zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话 ...

  4. ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用

    这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...

  5. ZooKeeper(七)-- ZK原生API实现分布式锁

    一.使用场景 在分布式应用,往往存在多个进程提供同一服务.这些进程有可能在相同的机器上,也有可能分布在不同的机器上. 如果这些进程共享了一些资源,可能就需要分布式锁来锁定对这些资源的访问. 二.实现分 ...

  6. Zookeeper系列2 原生API 以及核心特性watcher

    原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...

  7. curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API

    打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...

  8. ZooKeeper实现配置中心的实例(原生API实现)(转)

    说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...

  9. zookeeper zkClient api 使用

    操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...

随机推荐

  1. hibernate学习笔记之四 Hibernate的增删改查

    采用JUnit测试,继承TestCase import java.util.Date; import junit.framework.TestCase; import org.hibernate.Se ...

  2. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  3. 【WP开发】加密篇:双向加密

    说起双向加密,如果以前在.NET开发中弄过加/解密的朋友都不会陌生,常用的算法有DES.AES等.在RT应用程序中,也提供了加密相关的API,算法自然是一样的,只是API的封装方式不同罢了,因为RT不 ...

  4. sizzle分析记录:关于querySelectorAll兼容问题

    querySelector和querySelectorAll是W3C提供的新的查询接口 目前几乎主流浏览器均支持了他们.包括 IE8(含) 以上版本. Firefox. Chrome.Safari.O ...

  5. Windows Phone 8弹窗

    新建一个UserControl,添加到相应位置 <Grid x:Name="LayoutRoot" Background="{StaticResource Phon ...

  6. MySQL学习笔记十二:数据备份与恢复

    数据备份 1.物理备份与逻辑备份 物理备份 物理备份就是将数据库的数据文件,配置文件,日志文件等复制一份到其他路径上,这种备份速度一般较快,因为只有I/O操作.进行物理备份时,一般都需要关闭mysql ...

  7. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

  8. canvas学习和面向对象(二)

    Canvas 学习(二) 上一篇Canvas 学习(一)中我是用canvas绘制了一些基本和组合的图形. 现在开始绘制图片和动画帧,以及面向对象的升级版本. 还是一样,看代码,所有的代码都托管在git ...

  9. 微服务实战(二):使用API Gateway--转

    原文地址:http://dockone.io/article/482 [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选 ...

  10. c/c++ 函数、常量、指针和数组的关系梳理

    压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习……无限循环中,好记性不如烂笔头……从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和 ...