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

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. AngularJs之一

    在讲正题之前,先说一下有关angular简介方面的信息: 1. angularJS  诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用 ...

  2. Atitit 教育与培训学校 的计划策划 v4 qc18

    Atitit 教育与培训学校 的计划策划 v4 qc18 1.1. 版本历史12. 教育历史的前世今生12.1. 自学vs 家庭学校vs 私立学校vs 公立学校模式 vs 企业内部学校 vs 其他商业 ...

  3. 【初恋】vue单页应用开发总结

    vue新人,没有高级技巧 本文主要总结了使用vue-cli脚手架安装开发环境,使用vue.js等进行单页应用开发所遇问题的总结. 技术栈: Vue v1.0.21, vue-resource v0.9 ...

  4. 基于redis实现可靠的分布式锁

    什么是锁 今天要谈的是如何在分布式环境下实现一个全局锁,在开始之前先说说非分布式下的锁: 单机 – 单进程程序使用互斥锁mutex,解决多个线程之间的同步问题 单机 – 多进程程序使用信号量sem,解 ...

  5. 关于xcode导出设置中的一些概念

    Development Certificates:在电脑通过秘钥串生成一个私人秘钥,这就是:CertificateSigningRequest.certSigningRequest 简称CSR,团队中 ...

  6. JavaScript之糟粕

    0.导言 在上篇<JavaScript之毒瘤>中,列举了一些在JavaScript中难以避免的问题特性.本篇将会展示JavaScript中有问题的特性,但我们很容易就能便面它们.通过这些简 ...

  7. 6-tips-for-managing-property-files-with-spring--转

    原文地址:http://www.summa.com/blog/2009/04/20/6-tips-for-managing-property-files-with-spring What could ...

  8. IOS-Foundation框架结构

    这些东西,等用的时候查资料就行,用的多了,自然就记住了,大概过一下 发现一个不错的 ios 学习博客:http://www.cnblogs.com/kenshincui,非常好,推荐看看.FOunda ...

  9. 【TortoiseSVN使用教程】

    TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository        首 先要Checkout服务器端的Repository,所谓的Ch ...

  10. Tomcat服务器本地的搭建,以及在 IDEA软件下的配置,以及项目的测试运行(基于supermvc框架下的web)

    一.声明 使用了基于springmvc的supermvc的web框架.实习公司的框架. 二.tomact的下载与安装 1选择适合自己电脑配置的jdk和jre版本(截图来自tomcat的官方网站http ...