今天也是刚开始学习Zookeeper,学习过程中也试着开始写一些博客笔记来记录自己的学习过程和新的。
一、Zookeeper简单的介绍
zookeeper是一个分布式服务框架,简称“zk”,简单地来说zk类似一个文件夹系统,每个文件就是zk的一个节点,每个节点包含key、value且节点不允许重复,核心在于 - 事件监听
1. zk应用场景
(1)可以做注册中心 (Dubbo+zookeeper)
(2)分布式配置中心 (使用disconfig+事件节点通知来实现)
(3)分布式锁 (redis也可做分布式锁)
(4)分布式发布订阅
2. Zookeeper基本特性
节点分为节点名称和节点value,每个节点的路径必须唯一且不允许重复。
每个节点都有事件监听,当节点发生改变都可以获取到对应的消息。
3. Zookeeper单击版安装步骤
这里我是基于Centos7、jdk1.8+的环境进行安装的。
解压zk压缩包 ~# tar -zxvf zookeeper-3.4.14.tar.gz
进入到zk目录 ~# cd zookeeper-3.4.14
zk目录中创建data和logs文件夹 ~# mkdir data mkdir logs
进入到conf目录,修改文件名称 ~# mv zoo_sample.cfg zoo.cfg
编辑zoo.cfg的内容 ~# dataDir =/usr/local/zookeeper-3.4.14/data
dataLogDir=/usr/local/zookeeper-3.4.14/logs
启动zk ~# ./zkServer.sh start
查看zk状态 ~# ./zkServer.sh status
看到如下效果则表示启动成功:
zk单机版启动成功4. Zookeeper的节点类型
Zookeeper的节点类型总共分为以下四种:后面会具体介绍到对应的API
临时节点 会话关闭,节点会消失
临时有序号节点
持久节点 节点会持久化到硬盘当中
持久有序号节点
5. Zookeeper的ACL权限控制
ACL权限控制:实际是指对zookeeper的节点进行访问控制,大致分为四种方式:
(1)world:默认方式,谁都可以访问。
(2)auth:代表已经通过用户名密码验证的用户。
(3)digest:用户名密码验证的方式。 也是业务系统中最常用。
(4)ip:使用ip地址认证。
二、使用Java语言来操作Zookeeper
上面写了这么多理论知识,还不如来点代码好一些,下面是我在学习过程中写的一些demo,在此也记录一下。
1. Java简单的连接Zookeeper实现节点的创建
// zk连接地址
private static final StringconnectString ="192.168.203.130:2181";
// zk超时时间
private static final int timeOut =5000;
public static void main(String[] args)throws IOException, KeeperException, InterruptedException {
/**
* 初始化连接zk
* 参数1:zk连接地址
* 参数2:zk超时时间
* 参数3:事件通知
*/
ZooKeeper zooKeeper =new ZooKeeper(connectString, timeOut, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
Event.KeeperState state = watchedEvent.getState();
if (state == Event.KeeperState.SyncConnected) {
System.out.println("zk连接成功!!!");
}
}
});
/**
* 创建zk节点
* 参数1:zk的节点路径,此处必须带/* 不然会报错
* 参数2:节点内容
* 参数3:节点类型
* 参数4:节点类型
* PERSISTENT_SEQUENTIAL 持久有序号 PERSISTENT 持久
* EPHEMERAL_SEQUENTIAL 临时有序号 EPHEMERAL 临时节点
*/
String result = zooKeeper.create("/zkDemo", "zkDemo节点内容".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(result);
zooKeeper.close();
}
2. 给节点设置权限
// 1.创建zooKeeper连接
ZooKeeperzooKeeper =new ZooKeeper("192.168.212.135", 500, new Watcher() {
public void process(WatchedEvent watchedEvent) {
System.out.println(watchedEvent.getState().name());
}
});
// 2.创建账号权限 admin可以实现读写操作
Idid1 =new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));
ACLacl1 =new ACL(ZooDefs.Perms.ALL, id1);
// 3.创建权限guest 只允许做读操作
Idid2 =new Id("digest", DigestAuthenticationProvider.generateDigest("guest:guest123"));
ACLacl2 =new ACL(ZooDefs.Perms.READ, id2);
// 4.添加该账号
ArrayListaces =new ArrayList();
aces.add(acl1);
aces.add(acl2);
// 5.创建该节点
String s1=zooKeeper.create("/zkDemo","zkDemo内容".getBytes(),aces,CreateMode.PERSISTENT);
System.out.println("s1:"+s1);
网友评论