ZooKeeper演示案例
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演示案例相关推荐
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...
- WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例
最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...
- html行内样式 修改,HTML的行内样式演示案例
在讲html的行内样式之前,首先跟大家说明一下什么叫做样式.所谓样式就是用来修饰网站页面的,使得页面更加好看有特效,从而提升用户的浏览体验.Html的样式主要分为三种形式,分别是 今天咱们就将html ...
- html关于页内样式,HTML的页内样式演示案例
上一讲讲解了html的行内样式,今天咱们聊一聊html的页内样式,这个具体怎么用呢?且看博主为大家详解. 首先利用以下代码做案例演示: -//W3C//DTD XHTML 1.0 Transition ...
- 工控安全:攻防演示案例分享
列举一些可以在工控安全项目中用的攻防演示案例,持续更新...... 前言 在某核电的安全项目中,感谢公司leader信任让我负责项目的总体方案设计.攻防案例设计.安全防护等方案,经过前期大量的搜索.复 ...
- 学校计算机教学演示,案例演示在计算机基础教学中的运用
随着电脑的普及,计算机基础教学也在逐步地发展,教学方法和教学理念也日趋完善.由于计算机基础是一门比较强调动手能力和实用性的学科,它要求学生能自己动手操作,那么案例演示这种教学方法就比较适用于计算机基础 ...
- Kafka单机部署学习演示案例
Kafka 单机部署演示 前置准备 虚拟机配置: 内存:3G 处理器:1 核数:1 (一)kafka 安装 去kafka官网下载稳定版本到Linux服务器中进行解压安装.下载链接,我这里使用的是2.7 ...
- 使用jap的specification动态查询的演示案例与一些注意事项
目录 学习背景与使用步骤 使用specification进行动态分页查询案例演示,包含按时间的范围查询 学习背景与使用步骤 最近在项目中遇到一个需求:对单个或者是多个条件进行分页查询(写在一个接口中) ...
- java工作流引擎证照库类型的流程设计 实现方案与演示案例
关键词: .Net开源工作流 工作流引擎 工作流引擎常用信息存储 流程前置导航 证照库的概念&应用场景: 我们在梳理流程的时候,会发现有一些流程的发起是基于一个实体信息的. 比如: ...
最新文章
- sklearn使用FeatureHasher处理字符串特征
- 请教context:component-scan/和mvc:annotation-driven/的区别20
- 轻松理解正向代理与反向代理
- 电脑看不到光驱盘符,应该如何解决
- minecraft服务器_如何启动自己的Minecraft服务器进行多人游戏
- HDU 3573(详解+思路+代码)
- aria2c下载迅雷离线
- 教大家一个简单的办法
- SQLite性能提升10倍的Web数据库
- 重构之以委托取代继承
- Docker日志自动化: ElasticSearch、Logstash、Kibana以及Logspout
- silverlight3.0 怎么调试XAML对应的XAML.CS文件
- 为什么家里pm25比外面高_夫妻感情很好,男人为什么还会找情人?这是我听过最好的答案...
- 金山文字应用技巧两则(转)
- python 让电脑发出声音代码_python - 代码完成时发出声音警报
- keyshot pro 10报许可证(*.lic)对该计算机无效解决办法
- 从字符串中提取IP子串(C语言)
- okGo框架的使用,下载列表显示
- 日本杂货连锁店Loft首家海外直营店于上海开业
- 计算机455端口,455端口怎么关闭-455端口关闭的方法 - 河东软件园
热门文章
- Java实现文件分割和文件合并实例
- C语言单链表读入文件表妹,电面|LOFTER(乐乎) - 让兴趣,更有趣
- windows 下frp服务启动_内网穿透frp linux服务端搭建和windows客户端使用
- 8279键盘扫描c语言程序,8279键盘显示C程序
- 单片机原理,单片机能做什么?
- 【Java工具类】使用Random类对象生成随机整数
- centos7.0 lamp mysql_CentOS7 yum安装LNMP以及LAMP
- 关于学习Python的一点学习总结(37->集合运算)
- 用pycharm写python_使用Pycharm编写第一个python程序
- 【图论专题】欧拉路径和欧拉回路