源代码:https://github.com/Zou2021/zkDemo
1、修改本机配置文件
在C:\Windows\System32\drivers\etc的hosts文件中添加
192.168.210.101 hadoop101
192.168.210.102 hadoop102
192.168.210.103 hadoop103
192.168.210.104 hadoop104
2、客户端监听代码实现
package listenerDemo;
import org.apache.zookeeper.ZooKeeper;
import java.util.List;
/**
* @author: 邹祥发
* @date: 2021/4/30 08:20
* 需求:开发一个可以监听zk中servers下面的内容发生变化的程序
* 如果发生变化,立马执行监听器的方法(打印名单)
*/
public class ClientDemo {
public static void main(String[] args) throws Exception {
ClientDemo client = new ClientDemo();
//1:连接 zk
client.connect();
//2:查询所有节点
client.showServerList();
//3:保持程序运行
client.keepRunning();
}
//3台zk
private final static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
private final static int sessionTimeout = 2000;
private ZooKeeper zk = null;
private void connect() throws Exception {
zk = new ZooKeeper(connectString, sessionTimeout, watchedEvent -> {
//打印名单
try {
showServerList();
} catch (Exception e) {
e.printStackTrace();
}
});
}
private void showServerList() throws Exception {
String parentNode = "/servers";
System.out.println("打印服务器的名单");
//true表示启用监听器
List<String> servers = zk.getChildren(parentNode, true);
System.out.println(servers);
}
private void keepRunning(){
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
3、在集群上创建/servers节点
4、测试监听(成功)
5、使用服务端实现动态上下线
package listenerDemo;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
/**
* @author: 邹祥发
* @date: 2021/4/30 09:21
* 需求:不需要监听,当前是服务器,只要上线的时候,创建servers的子文件夹
* 下线的时候,删除名字对应的文件夹
*/
public class ServerDemo {
public static void main(String[] args) throws Exception {
ServerDemo client = new ServerDemo();
//1:连接 zk
client.connect();
//2:创建servers的子文件夹
client.createNode(args[0]);
//3:保持程序运行
client.keepRunning();
}
private void createNode(String hostname) throws Exception {
String parentNode = "/servers";
zk.create(parentNode + "/" + hostname, hostname.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
//3台zk
private final static String connectString = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
private final static int sessionTimeout = 2000;
private ZooKeeper zk = null;
private void connect() throws Exception {
zk = new ZooKeeper(connectString, sessionTimeout, watchedEvent -> {
});
}
private void keepRunning() {
try {
Thread.sleep(Long.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}