1 客户端命令行操作

命令基本语法 功能描述
help 显示所有操作命令
ls path [watch] 使用 ls 命令来查看当前znode中所包含的内容
ls2 path [watch] 查看当前节点数据并能看到更新次数等数据
create 普通创建-s 含有序列-e 临时(重启或者超时消失)
get path [watch] 获得节点的值
set 设置节点的具体值
stat 查看节点状态
delete 删除节点
rmr 递归删除节点

1.启动客户端

[hadoop103 zookeeper-3.4.10]$ bin/zkCli.sh

2.显示所有操作命令

[zk: localhost:2181(CONNECTED) 1] help

3.查看当前znode中所包含的内容

[zk: localhost:2181(CONNECTED) 0] ls /[zookeeper]

4.查看当前节点详细数据

[zk: localhost:2181(CONNECTED) 1] ls2 /[zookeeper]cZxid = 0x0ctime = Thu Jan 01 08:00:00 CST 1970mZxid = 0x0mtime = Thu Jan 01 08:00:00 CST 1970pZxid = 0x0cversion = -1dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 0numChildren = 1

5.分别创建2个普通节点

[zk: localhost:2181(CONNECTED) 3] create /sanguo "jinlian"Created /sanguo[zk: localhost:2181(CONNECTED) 4] create /sanguo/shuguo "liubei"Created /sanguo/shuguo

6.获得节点的值

[zk: localhost:2181(CONNECTED) 5] get /sanguojinliancZxid = 0x100000003ctime = Wed Aug 29 00:03:23 CST 2018mZxid = 0x100000003mtime = Wed Aug 29 00:03:23 CST 2018pZxid = 0x100000004cversion = 1dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 7numChildren = 1[zk: localhost:2181(CONNECTED) 6][zk: localhost:2181(CONNECTED) 6] get /sanguo/shuguoliubeicZxid = 0x100000004ctime = Wed Aug 29 00:04:35 CST 2018mZxid = 0x100000004mtime = Wed Aug 29 00:04:35 CST 2018pZxid = 0x100000004cversion = 0dataVersion = 0aclVersion = 0ephemeralOwner = 0x0dataLength = 6numChildren = 0

7.创建短暂节点

[zk: localhost:2181(CONNECTED) 7] create -e /sanguo/wuguo "zhouyu"Created /sanguo/wuguo

(1)在当前客户端是能查看到的

[zk: localhost:2181(CONNECTED) 3] ls /sanguo [wuguo, shuguo]

(2)退出当前客户端然后再重启客户端

[zk: localhost:2181(CONNECTED) 12] quit[hadoop104 zookeeper-3.4.10]$ bin/zkCli.sh

(3)再次查看根目录下短暂节点已经删除

[zk: localhost:2181(CONNECTED) 0] ls /sanguo[shuguo]

8.创建带序号的节点

(1)先创建一个普通的根节点/sanguo/weiguo

[zk: localhost:2181(CONNECTED) 1] create /sanguo/weiguo "caocao"Created /sanguo/weiguo

(2)创建带序号的节点

[zk: localhost:2181(CONNECTED) 2] create -s /sanguo/weiguo/xiaoqiao "jinlian"Created /sanguo/weiguo/xiaoqiao0000000000[zk: localhost:2181(CONNECTED) 3] create -s /sanguo/weiguo/daqiao "jinlian"Created /sanguo/weiguo/daqiao0000000001[zk: localhost:2181(CONNECTED) 4] create -s /sanguo/weiguo/diaocan "jinlian"Created /sanguo/weiguo/diaocan0000000002

如果原来没有序号节点,序号从0开始依次递增。如果原节点下已有2个节点,则再排序时从2开始,以此类推。

9.修改节点数据值

[zk: localhost:2181(CONNECTED) 6] set /sanguo/weiguo "simayi"

10.节点的值变化监听

(1)在hadoop104主机上注册监听/sanguo节点数据变化

[zk: localhost:2181(CONNECTED) 26] [zk: localhost:2181(CONNECTED) 8] get /sanguo watch

(2)在hadoop103主机上修改/sanguo节点的数据

[zk: localhost:2181(CONNECTED) 1] set /sanguo "xisi"

(3)观察hadoop104主机收到数据变化的监听

WATCHER::WatchedEvent state:SyncConnected type:NodeDataChanged path:/sanguo

11.节点的子节点变化监听(路径变化)

​ (1)在hadoop104主机上注册监听/sanguo节点的子节点变化

[zk: localhost:2181(CONNECTED) 1] ls /sanguo watch[aa0000000001, server101]

​ (2)在hadoop103主机/sanguo节点上创建子节点

[zk: localhost:2181(CONNECTED) 2] create /sanguo/jin "simayi"Created /sanguo/jin

​ (3)观察hadoop104主机收到子节点变化的监听

WATCHER::WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/sanguo

12.删除节点

[zk: localhost:2181(CONNECTED) 4] delete /sanguo/jin

13.递归删除节点

[zk: localhost:2181(CONNECTED) 15] rmr /sanguo/shuguo

14.查看节点状态

[zk: localhost:2181(CONNECTED) 17] stat /sanguocZxid = 0x100000003ctime = Wed Aug 29 00:03:23 CST 2018mZxid = 0x100000011mtime = Wed Aug 29 00:21:23 CST 2018pZxid = 0x100000014cversion = 9dataVersion = 1aclVersion = 0ephemeralOwner = 0x0dataLength = 4numChildren = 1

2 API应用

环境搭建

1.创建一个Maven工程

2.添加pom文件

<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>RELEASE</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.8.2</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version></dependency></dependencies>

3.拷贝log4j.properties文件到项目根目录

需要在项目的src/main/resources目录下,新建一个文件,命名为“log4j.properties”,在文件中填入。

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

创建ZooKeeper客户端

//注意:在connectString中,不能有空格,否则会报java.net.UnknownHostException异常private static final String CONNECT_STRING = "CentOS001:2181,CentOS004:2181,CentOS005:2181";private int SESSION_TIMEOUT = 2000;private ZooKeeper zkClient;@Beforepublic void init() throws IOException {zkClient = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("---------start----------");// 收到事件通知后的回调函数(用户的业务逻辑)System.out.println("====================:"+event.getType() + "--" + event.getPath());List<String> children;// 再次启动监听try {children = zkClient.getChildren("/", true);for (String child : children) {System.out.println(child);}System.out.println("---------end----------");} catch (KeeperException |InterruptedException e) {e.printStackTrace();}}});}

创建子节点

/*** 1 创建节点* @throws KeeperException* @throws InterruptedException*/@Testpublic void createNode() throws KeeperException, InterruptedException {String path = zkClient.create("/htzw", "hangtian".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println(path);}

获取子节点并监听节点变化

/*** 2 获取子节点 并监控节点的变化* @throws KeeperException* @throws InterruptedException*/@Testpublic void getDataAndWatch() throws KeeperException, InterruptedException {List<String> children = zkClient.getChildren("/", true);for (String child : children) {System.out.println(child);}// 延时阻塞Thread.sleep(Long.MAX_VALUE);}

判断Znode是否存在

/*** 3 判断节点是否存在* @throws KeeperException* @throws InterruptedException*/@Testpublic void exist() throws KeeperException, InterruptedException {Stat stat = zkClient.exists("/htzw", false);System.out.println(stat == null ? "not exist" : "exist");}

3 监听服务器节点动态上下线案例

1.需求

某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。

2.需求分析,如图5-12所示

服务器动态上下线案例分析

3.具体实现

(0)先在集群上创建/servers节点

[zk: localhost:2181(CONNECTED) 10] create /servers "servers"
Created /servers

(1)服务器端向Zookeeper注册代码

public class DistributeServer {private static final String CONNECT_STRING = "CentOS001:2181,CentOS004:2181,CentOS005:2181";private static final int SESSION_TIMEOUT = 2000;private ZooKeeper zkClient;/*** 创建到zk的客户端连接* @throws IOException*/private void getConnect() throws IOException {zkClient = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> {});}private void business() throws InterruptedException {System.out.println("working ...");Thread.sleep(Long.MAX_VALUE);}/*** 注册服务器* @param hostname* @throws KeeperException* @throws InterruptedException*/private void registerServer(String hostname) throws KeeperException, InterruptedException {String path = zkClient.create("/servers/server", hostname.getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname + "is online ---psth:"+path);}public static void main(String[] args) throws Exception {DistributeServer server = new DistributeServer();// 1 连接zookeeper集群server.getConnect();// 2 注册节点server.registerServer("10.0.1.55");// 3 业务逻辑处理server.business();}
}

(2)客户端代码

public class DistributeClient {private String CONNECT_STRING = "CentOS001:2181,CentOS004:2181,CentOS005:2181";private int SESSION_TIMEOUT = 2000;private ZooKeeper zkClient;/*** 业务功能* @throws InterruptedException*/private void business() throws InterruptedException {System.out.println("client is working ...");Thread.sleep(Long.MAX_VALUE);}/*** 获取服务器列表信息* @throws KeeperException* @throws InterruptedException*/private void getServerList() throws KeeperException, InterruptedException {//获取服务器子节点信息,并且对父节点进行监听List<String> children = zkClient.getChildren("/servers", true);// 存储服务器节点主机名称集合ArrayList<String> hosts = new ArrayList<>();// 遍历所有节点,获取节点中的主机名称信息for (String child : children) {byte[] data = zkClient.getData("/servers/" + child, false, null);hosts.add(new String(data));}// 将所有在线主机名称打印到控制台System.out.println("*****************************");System.out.println(hosts);System.out.println("*****************************");}/*** 创建到zk的客户端连接* @throws IOException*/private void getConnect() throws IOException {zkClient = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> {// 再次启动监听try {getServerList();} catch (Exception e) {e.printStackTrace();}});}public static void main(String[] args) throws Exception {DistributeClient client = new DistributeClient();// 1 获取zookeeper集群连接client.getConnect();// 2 注册监听client.getServerList();// 3 业务逻辑处理client.business();}
}

ZooKeeper演示案例相关推荐

  1. 学习笔记:Zookeeper 应用案例(上下线动态感知)

    1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...

  2. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

    最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...

  3. html行内样式 修改,HTML的行内样式演示案例

    在讲html的行内样式之前,首先跟大家说明一下什么叫做样式.所谓样式就是用来修饰网站页面的,使得页面更加好看有特效,从而提升用户的浏览体验.Html的样式主要分为三种形式,分别是 今天咱们就将html ...

  4. html关于页内样式,HTML的页内样式演示案例

    上一讲讲解了html的行内样式,今天咱们聊一聊html的页内样式,这个具体怎么用呢?且看博主为大家详解. 首先利用以下代码做案例演示: -//W3C//DTD XHTML 1.0 Transition ...

  5. 工控安全:攻防演示案例分享

    列举一些可以在工控安全项目中用的攻防演示案例,持续更新...... 前言 在某核电的安全项目中,感谢公司leader信任让我负责项目的总体方案设计.攻防案例设计.安全防护等方案,经过前期大量的搜索.复 ...

  6. 学校计算机教学演示,案例演示在计算机基础教学中的运用

    随着电脑的普及,计算机基础教学也在逐步地发展,教学方法和教学理念也日趋完善.由于计算机基础是一门比较强调动手能力和实用性的学科,它要求学生能自己动手操作,那么案例演示这种教学方法就比较适用于计算机基础 ...

  7. Kafka单机部署学习演示案例

    Kafka 单机部署演示 前置准备 虚拟机配置: 内存:3G 处理器:1 核数:1 (一)kafka 安装 去kafka官网下载稳定版本到Linux服务器中进行解压安装.下载链接,我这里使用的是2.7 ...

  8. 使用jap的specification动态查询的演示案例与一些注意事项

    目录 学习背景与使用步骤 使用specification进行动态分页查询案例演示,包含按时间的范围查询 学习背景与使用步骤 最近在项目中遇到一个需求:对单个或者是多个条件进行分页查询(写在一个接口中) ...

  9. java工作流引擎证照库类型的流程设计 实现方案与演示案例

    关键词: .Net开源工作流    工作流引擎   工作流引擎常用信息存储  流程前置导航 证照库的概念&应用场景: 我们在梳理流程的时候,会发现有一些流程的发起是基于一个实体信息的. 比如: ...

最新文章

  1. sklearn使用FeatureHasher处理字符串特征
  2. 请教context:component-scan/和mvc:annotation-driven/的区别20
  3. 轻松理解正向代理与反向代理
  4. 电脑看不到光驱盘符,应该如何解决
  5. minecraft服务器_如何启动自己的Minecraft服务器进行多人游戏
  6. HDU 3573(详解+思路+代码)
  7. aria2c下载迅雷离线
  8. 教大家一个简单的办法
  9. SQLite性能提升10倍的Web数据库
  10. 重构之以委托取代继承
  11. Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout
  12. silverlight3.0 怎么调试XAML对应的XAML.CS文件
  13. 为什么家里pm25比外面高_夫妻感情很好,男人为什么还会找情人?这是我听过最好的答案...
  14. 金山文字应用技巧两则(转)
  15. python 让电脑发出声音代码_python - 代码完成时发出声音警报
  16. keyshot pro 10报许可证(*.lic)对该计算机无效解决办法
  17. 从字符串中提取IP子串(C语言)
  18. okGo框架的使用,下载列表显示
  19. 日本杂货连锁店Loft首家海外直营店于上海开业
  20. 计算机455端口,455端口怎么关闭-455端口关闭的方法 - 河东软件园

热门文章

  1. Java实现文件分割和文件合并实例
  2. C语言单链表读入文件表妹,电面|LOFTER(乐乎) - 让兴趣,更有趣
  3. windows 下frp服务启动_内网穿透frp linux服务端搭建和windows客户端使用
  4. 8279键盘扫描c语言程序,8279键盘显示C程序
  5. 单片机原理,单片机能做什么?
  6. 【Java工具类】使用Random类对象生成随机整数
  7. centos7.0 lamp mysql_CentOS7 yum安装LNMP以及LAMP
  8. 关于学习Python的一点学习总结(37->集合运算)
  9. 用pycharm写python_使用Pycharm编写第一个python程序
  10. 【图论专题】欧拉路径和欧拉回路