06_zookeeper_原生API使用2
1. 设置znode节点数据(同步)
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat; import java.io.IOException; public class SetDataSync implements Watcher {
private static ZooKeeper zk;
private String path; public static void main(String args[]) throws IOException, InterruptedException {
//zk will connect to zk server, asynchronized
zk = new ZooKeeper("192.168.179.101:2181", 5000, new SetDataSync());
Thread.sleep(Integer.MAX_VALUE);
} @Override
public void process(WatchedEvent event) {
// 连接建立后,设置给定路径的znode数据
if (event.getState() == Event.KeeperState.SyncConnected) {
// 连接刚刚建立
if (event.getType() == Event.EventType.None && event.getPath() == null) {
//创建新节点并重新设置data
try {
String path = zk.create("/node_by_java", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT );
setNodeData(path, "456");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }//process //get node data
private void setNodeData(String path, String data) throws KeeperException, InterruptedException {
System.out.println("Reset znode data");
//更新数据,返回节点状态
Stat stat;
stat = zk.setData(path, data.getBytes(), -1 );
//读取数据,验证是否设置成功
byte[] update_data = zk.getData(path, false, stat);
System.out.println("Updated Data of " + path + "is: " + new String(update_data));
} }
核心API分析: stat = zk.setData(path, data.getBytes(), -1 );
public Stat setData(String path,
byte[] data,
int version)
throws KeeperException,
InterruptedException 参数1: 要修改哪一个znode节点
参数2: 新数据, String.getBytes()可以根据String字符串生成新的byte数组
参数3: version为正数,则修改znode数据时会先查看znode的version是否和给定的相同,如果不同则抛出异常,表示这个节点的数据版本已经不是你给我的版本,可能其他人做了变更
如果version=-1,则表示更新数据时不进行版本比对,管你是什么版本,我就是要修改
2. znode访问权限ACL(同步)
2.1 znode访问权限基础
zk集群中znode的权限模式(scheme) 有2种:
1)基于 IP
2)基于 用户名+密码 (digest)
根据访问策略的不同,授权对象(ID) , 也就是哪些人能访问znode节点,有不同的形式
1)IP模式下, 授权对象,是具体的IP地址
2)digest模式下,授权对象,是 username:Base64(SHA-1(username:password)), SHA-1是加密,Base64是编码(将二进制数据转换为可读符号)
对znode可以进行的操作,就是权限(permission), zk提供了5种权限:
CREATE, DELETE, READ, WRITE, ADMIN
注:单个权限(有某个), 完全权限(所有), 复合权限(2项或多项)
权限组合 = 权限模式 + 授权对象 + 权限
2.2 zk框架提供的权限控制类ACL
ACL类具有2个属性:
* perm -- int类型,就是permission
* id -- ID类型,含有String scheme, String id ( 授权模式 + 授权对象)
public void process(WatchedEvent event) {
//
if (event.getState() == Event.KeeperState.SyncConnected) {
// 连接刚刚建立
if (event.getType() == Event.EventType.None && event.getPath() == null) {
//创建新节点, 并设置节点ACL权限
try {
// perms + id
// id = scheme, id
// perms = 读写复合权限, 基于IP地址授权
ACL acl1 = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE, new Id("ip", "192.168.179.100")); //基于IP的访问权限,ACL(perm,id(scheme,id))
ACL acl2 = null;
try {
// perms = 读写复合权限,基于digest方式授权,通过框架提供的方法自动生成:username:Base64(SHA-1(username:password))
acl2 = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE, new Id("digest", DigestAuthenticationProvider.generateDigest("shayzhang:1234")));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
ArrayList<ACL> acls = new ArrayList<ACL>();
acls.add(acl1);
acls.add(acl2);
// 创建znode,并设置ACL
String path = zk.create("/node_by_java", "123".getBytes(), acls, CreateMode.PERSISTENT );
// 提供认证信息给zk, 通过认证后操作节点
zk.addAuthInfo("digest", "shayzhang:1234".getBytes());
}//process
zk框架提供的ACL:
* ZooDefs.Ids.OPEN_ACL_UNSAFE 任何人可以进行任何操作
* ZooDefs.Ids.READ_ACL_UNSAFE 任何人可读
* ZooDefs.Ids.READ_ACL_UNSAFE 配合addAuthInfo使用,将前者作为节点的授权
06_zookeeper_原生API使用2的更多相关文章
- jQuery? 回归JavaScript原生API
如今技术日新月异,各类框架库也是层次不穷.即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势.但JS原生API写法依旧:并且 ...
- 注解 @RequestParam,@RequestHeader,@CookieValue,Pojo,servlet原生API
1.@RequestParam 我们的超链接:<a href="springMvc/testRequestParam">testRequestParam</a&g ...
- (原) 2.1 Zookeeper原生API使用
本文为原创文章,转载请注明出处,谢谢 Zookeeper原生API使用 1.jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中 <dependency> & ...
- PHP数据库操作:从MySQL原生API到PDO
本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的. 为了后面的测试,先建立数据库表test.包含表名user,s ...
- 使用IOS7原生API进行二维码条形码的扫描
使用IOS7原生API进行二维码条形码的扫描 IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析 ...
- springmvc使用pojo和servlet原生api作为参数
一.Pojo作为参数: 实体: package com.hy.springmvc.entities; public class User { private String username; priv ...
- 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快
前言: 使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合: 1.原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快 2.不包含任何第三方库/框架,可以灵活 ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...
- Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话
一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...
随机推荐
- 剑指Offer——求1+2+3+...+n
题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析: 递归实现. 代码: class So ...
- 使用Custom Draw优雅的实现ListCtrl的重绘
common control 4.7版本介绍了一个新的特性叫做Custom Draw,这个名字显得模糊不清,让人有点摸不着头脑,而且MSDN里也只给出了一些如风的解释和例子,没有谁告诉你你想知道的,和 ...
- tornado调用ioloop TracebackFuture实现非堵塞的模块
转载http://xiaorui.cc/2014/11/26/tornado调用ioloop-tracebackfuture实现非堵塞的模块/ 当然实现的方法,还是存在点问题的, 但是最少流程是跑通了 ...
- Jmeter(八)Jmeter监控tomcat
1.配置tomcat的配置文件conf/tomcat-users.xml 2. 在“线程组”上右键“添加”--“配置元件”--“HTTP授权管理器”,这里主要是让JMeter能够通过Tomcat的基本 ...
- Mysql-xtrabackup 与MySQL5.7 binlog 实现数据即时点恢复
Mysql-xtrabackup 与MySQL5.7 binlog 实现数据即时点恢复 一.数据库准备 1. rpm -e mariadb-libs postfix tar xf mysql-5.7 ...
- PKU 3169 Layout(差分约束系统+Bellman Ford)
题目大意:原题链接 当排队等候喂食时,奶牛喜欢和它们的朋友站得靠近些.FJ有N(2<=N<=1000)头奶牛,编号从1到N,沿一条直线站着等候喂食.奶牛排在队伍中的顺序和它们的编号是相同的 ...
- ZOJ - 2587 Unique Attack (判断最小割是否唯一)
题意:判断最小割是否唯一. 分析:跑出最大流后,在残余网上从源点和汇点分别dfs一次,对访问的点都打上标记. 若还有点没有被访问到,说明最小割不唯一. https://www.cnblogs.com/ ...
- sgu 100 A+B 解题报告及测试数据
100.A+B time limit per test: 0.25 sec. memory limit per test: 65536 KB 题解:上手题,不解释. 直接上代码: #include & ...
- android整理的一些基础知识
本篇文章内容大部分是来源于本人实际开发中的心得总结,不是非常全面,咱才疏学浅,如果有错误的地方恳请各位指出哦~ android四大组件 四大组件包括:Activity(活动),Service(服务), ...
- 【Linux学习】1.Linux基础知识
记录学习Linux 系统的相关知识点,欢迎大家拍砖交流,一起成长:QQ:2712192471 作者背景:前端开发工程师 | Python | web安全爱好者 一,Windows系统下 Linux 的 ...