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的更多相关文章

  1. jQuery? 回归JavaScript原生API

    如今技术日新月异,各类框架库也是层次不穷.即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势.但JS原生API写法依旧:并且 ...

  2. 注解 @RequestParam,@RequestHeader,@CookieValue,Pojo,servlet原生API

    1.@RequestParam 我们的超链接:<a href="springMvc/testRequestParam">testRequestParam</a&g ...

  3. (原) 2.1 Zookeeper原生API使用

    本文为原创文章,转载请注明出处,谢谢 Zookeeper原生API使用 1.jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中 <dependency> & ...

  4. PHP数据库操作:从MySQL原生API到PDO

    本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对象.PDO操作MySQL数据库的. 为了后面的测试,先建立数据库表test.包含表名user,s ...

  5. 使用IOS7原生API进行二维码条形码的扫描

    使用IOS7原生API进行二维码条形码的扫描 IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDK,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析 ...

  6. springmvc使用pojo和servlet原生api作为参数

    一.Pojo作为参数: 实体: package com.hy.springmvc.entities; public class User { private String username; priv ...

  7. 玩转nodeJS系列:使用原生API实现简单灵活高效的路由功能(支持nodeJs单机集群),nodeJS本就应该这样轻快

    前言: 使用nodeJS原生API实现快速灵活路由,方便与其他库/框架进行整合: 1.原生API,简洁高效的轻度封装,加速路由解析,nodeJS本就应该这样轻快 2.不包含任何第三方库/框架,可以灵活 ...

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

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

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

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

随机推荐

  1. react native 或 flutter 开发app

    react-native react native和原生Android/ios: https://www.oschina.net/news/97466/should-we-use-react-nati ...

  2. python模块之PIL模块(生成随机验证码图片)

    PIL简介 什么是PIL PIL:是Python Image Library的缩写,图像处理的模块.主要的类包括Image,ImageFont,ImageDraw,ImageFilter PIL的导入 ...

  3. karma安装

    Last login: Sat Jun :: on ttys000 ➜ ~ cd /Users/wangyizhe/Projects/work/smartcmp/services/new-yacmp/ ...

  4. C的指针疑惑:C和指针13(高级指针话题)上

    int *f(); f为一个函数,返回值类型是一个指向整形的指针. int (*f)(); 两对括号,第二对括号是函数调用操作符,但第一对括号只起到聚组的作用. f为一个函数指针,它所指向的函数返回一 ...

  5. Jenkins节点配置页面,启动方法没有"Launch agent via Java Web Start"解决方法?

    Jenkins的配置从节点中默认没有Launch agent via JavaWeb Start,解决办法: 步骤: 1:打开"系统管理"——"Configure Glo ...

  6. ADO是什么?

    ADO是一个组件,ADO不适于MFC但是可以在MFC里面使用.(ADO在1996年冬被发布.) 由于ADO在MFC使用的比较频繁,所以一些前辈将ADO的三个智能指针封装了. 之后就可以在MFC 更方便 ...

  7. select 自动选择 检查下拉列表

    下面我们来看一下selenium webdriver是如何来处理select下拉框的,以Apple注册页面为例. https://appleid.apple.com/cgi-bin/WebObject ...

  8. SuperObject使用

    SuperObject SuperObject第三方控件包,试用了下并编写了个DEMO,发现还是蛮强大.废话 少说,看看下面的代码就知道其强大: 1.JSON原始数据 {   "name&q ...

  9. Hive环境安装

    说明: (Hbase依赖于Hadoop,同时需要把元数据存放在mysql中),mysql自行安装 Hadoop2.0安装参考我的博客: https://www.cnblogs.com/654wangz ...

  10. JavaEE学习记录(一)--软件系统体系结构

    1 常见软件系统体系结构B/S.C/S 1.1 C/S l C/S结构即客户端/服务器(Client/Server),例如QQ: l 需要编写服务器端程序,以及客户端程序,例如我们安装的就是QQ的客户 ...