版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haidaiya/article/details/84726982
一 IDEA环境搭建
1.1 创建一个maven项目
在pom.xml添加如下依赖
<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>
在src/resource下面添加一个文件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
2.1 编写代码之前的思考
每次再写代码之前请想一想,我要写的是什么?Zookeeper分为客户端和服务端,服务端是那个102,103,104三台服务器对吧,那我们写客户端就相当于使用代码去连接Zookeeper的客户端对吧。还记得使用JDBC连接数据库吗,导包,加载驱动,URL,用户名,密码。。。。。。思考到这里就可以了。
2.2 测试Zookeeper客户端
- 创建TestZookeeper类
- 看到下面这么长的代码不要害怕,我先做解释,然后再看会好一点
- init()方法主要用于建立一个Zookeeper的客户端,直接new Zookeeper()即可,里面有三个参数,第一个是ip+端口,表示连接的主机客户端;第二个是超长连接时间2s;第三个是监听器,这个先不管
- 直接看getNodeAndWatch(),getChildern()表示获取Zookeeper集群上的子节点,并且对这个节点监听就是那个true表达的含义,此时重点来了,既然对 / 这个路径添加了监听,那么当 / 下发生变化,他会怎么做呢?还记得init()中的new watch()吗?里面有process()方法,上面我说先不管,现在管他了,当变化之后,客户端就会执行这个process方法,那么他会先输出子节点对吧,还有,之前上一篇博客中说过监听只执行一次,所以为了一直监听,我们需要在process中再次监听,一直往返执行,才能实现一直监听,是不是明白了很多
- Thread.sleep(Long.MAX_VALUE)是让那个线程不死,这样才能一直监听对吧。
- 下面我再根据输出结果来分析一波
删除了wangleijia,会发现少了wangleijia
增加节点wangleijia,下面就多了wangleijia
package com.haidai.zookeeper;
import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class A_textZookeeper {
private ZooKeeper zkCli;
//在zoo.cfg中clientPort=2181
private String connect = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
//会话超时2秒
private int sessionTimeout = 2000;
List<String> childs;
//1初始化zoo客户端
@Before
public void init() throws IOException {
zkCli = new ZooKeeper(connect, sessionTimeout, new Watcher() {
public void process(WatchedEvent event) {
try {
System.out.println("-----------监听前------------");
childs = zkCli.getChildren("/", true);
for (String child : childs) {
System.out.println(child);
}
System.out.println("-----------监听后------------");
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
//2创建字节点
@Test
public void createNode() throws KeeperException, InterruptedException {
/*
* path 节点在的路径
* data 节点上的内容(Zookeeper的规定)
* acl 访问的权限
* createMode 创建的节点类型(4类)
*/
String path = zkCli.create("/wangleijia", "wanglei".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(path);
}
//3获取字节点并监视子节点的变化
@Test
public void getNodeAndWatch() throws KeeperException, InterruptedException {
System.out.println("-----------监听前------------");
childs = zkCli.getChildren("/", true);
for (String child : childs) {
System.out.println(child);
}
System.out.println("-----------监听后------------");
Thread.sleep(Long.MAX_VALUE);
}
}
2.3 总结
这样子,我觉的Zookeeper我已经解释的很清楚了,总结一下:Zookeeper是一个提供协调服务的框架,它主要核心是文件系统和通知机制,文件系统像Linux,通知机制是监听器,在客户端中使用watch,在API中new Watch()。还有一些面试会问到的,比如选举机制。