(原) 2.1 Zookeeper原生API使用
本文为原创文章,转载请注明出处,谢谢
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());
- 提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE
- 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使用的更多相关文章
- Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话
一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...
- zookeeper原生API做java客户端
简介 本文是使用apache提供的原生api做zookeeper客户端 jar包 zookeeper-3.4.5.jar Demo package bjsxt.zookeeper.base; im ...
- ZooKeeper 原生API操作
zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话 ...
- ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用
这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...
- ZooKeeper(七)-- ZK原生API实现分布式锁
一.使用场景 在分布式应用,往往存在多个进程提供同一服务.这些进程有可能在相同的机器上,也有可能分布在不同的机器上. 如果这些进程共享了一些资源,可能就需要分布式锁来锁定对这些资源的访问. 二.实现分 ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...
- curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API
打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...
- ZooKeeper实现配置中心的实例(原生API实现)(转)
说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...
- zookeeper zkClient api 使用
操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...
随机推荐
- PHP扩展-扩展的生成和编译
首先说明一下,PHP扩展有两种编译方式:方式一:在编译PHP时直接将扩展编译进去方式二:扩展被编译成.so文件,在php.ini里配置加载路径: 以下开始说明创建PHP扩展并编译的步骤:下载PHP源码 ...
- 09 web开发高级应用(1)
- 1 <base> 标签用法 ```base: 为页面上的所有链接规定默认地址或默认目标target: 跳转到的目标页 <base target=_blank> <!- ...
- Security7:View Usage
一,在Database level上,主要有 sys.database_principals, sys.database_permissions 和 sys.database_role_members ...
- WPF gridview 不允许编辑
WPF gridview正常双击是运行编辑的,如何让他不允许编辑呢,如果采用readonly属性,在双击时会报错,当然可以通过try catch处理,但是这样不好,好一点的解决办法就是在绑定数据时采用 ...
- 解决Select2控件不能在jQuery UI Dialog中不能搜索的bug
本文使用博客园Markdown编辑器进行编辑 1.问题呈现 项目中使用了jQuery UI的Dialog控件,一般用来处理需要提示用户输入或操作的简单页面.逻辑是修改一个广告的图片和标题. 效果截图如 ...
- 窥探Swift之别样的枚举类型
想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了.Fundation框架和UIKit中的枚举更是数不胜数,枚举可以使你的代码更易阅读并且可以提高可维护性.在 ...
- MyCAT实现MySQL的读写分离
在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修 ...
- 如何部署Icinga服务端
Icinga是Nagios的一个变种,配置,使用方式几乎一样,而且完全兼容Nagios的插件.所以下面的部署方案对Nagios同样使用. 它还推出了两个中文版本,icinga-cn原版和icinga- ...
- nodejs与javascript中的aes加密
简介 1.aes加密简单来说,在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.高级加密标准已然成为对称密钥加 ...
- Spark入门实战系列--10.分布式内存文件系统Tachyon介绍及安装部署
[注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .Tachyon介绍 1.1 Tachyon简介 随着实时计算的需求日益增多,分布式内存计算 ...