zookeeper服务器动态上下线监听案例

server/2024/10/19 21:41:21/

zookeeper_0">zookeeper服务器动态上下线监听案例

文档

  1. linux安装java -centos安装java -linux配置java环境变量
  2. zookeeper单机安装
  3. zookeeper集群安装
  4. zookeeper客户端命令行操作、节点类型及监听器
  5. zookeeper集群写数据原理
  6. java操作zookeeper

说明

两种角色:服务器、客户端
客户端监听服务器的状态,服务器上线下变化时,客户端接收到通知
无论是服务器,还是客户端,对于zookeeper来说,都是zookeeper客户端

原理

  1. zookeeper临时节点的性质:zookeeper客户端断开连接后,节点自动删除

  2. 客户端设置监听器,监听子节点变化,监听/servers节点的子节点:

    ls -w /servers
    

    需要注意的是,监听器仅监听一次,想要重复监听,则需要重复设置监听

  3. 服务器连接,创建临时节点,客户端监听,服务器上线

  4. 服务器断开连接,临时节点自动删除,客户端监听,服务器下线

命令行模拟服务器动态上下线监听

  1. 客户端连接(启动一个zookeeper客户端),设置监听

    ls -w /servers
    
  2. 服务器1连接(启动一个zookeeper客户端),新增子节点,节点类型为临时有序号节点,可以通过序号获知该子节点的创建顺序,创建即表示服务器在线

    create -e -s /servers/server
    
  3. 此时客户端将收到监听回调,此时可以获取子节点列表,来查看最新的服务器在线情况

    ls /servers
    

    客户端再次设置监听

    ls -w /servers
    
  4. 服务器2连接,重复步骤2

  5. 客户端,重复步骤3

  6. 服务器1断开连接,创建的临时节点将自动删除

  7. 客户端,重复步骤3

  8. 服务器2断开连接,创建的临时节点将自动删除

  9. 客户端,重复步骤3

java代码实现服务器动态上下线监听

  1. 客户端示例代码DistributeClient.java

    package xin.yangshuai.zookeeper01.case1;import org.apache.zookeeper.KeeperException;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;import java.io.IOException;
    import java.util.List;public class DistributeClient {// 注意:逗号左右不能有空格private String connectString = "192.168.145.132:2181,192.168.145.133:2181,192.168.145.134:2181";// 2000毫秒private int sessionTimeout = 2000;private ZooKeeper zkClient;public void getConnect() throws IOException {zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {// 初始化时,会执行一次System.out.println("当前监听的节点:" + watchedEvent.getPath());try {// 由于注册一次,监听一次,如果想持续监听,可重新注册// getServerList()方法设置了监听,所以每次调用将重新注册监听getServerList();} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}});}private void getServerList() throws KeeperException, InterruptedException {// 参数watch设置为true,表示使用zkClient创建时的Watcher,并监听当前节点的子节点的增删变化// 提前创建好 /servers 节点List<String> children = zkClient.getChildren("/servers", true);System.out.println("服务器在线数量:" + children.size());for (String child : children) {System.out.println("服务器 " + child + " 在线");}}
    }
    
  2. 服务端示例代码DistributeServer.java

    package xin.yangshuai.zookeeper01.case1;import org.apache.zookeeper.*;import java.io.IOException;public class DistributeServer {// 注意:逗号左右不能有空格private String connectString = "192.168.145.132:2181,192.168.145.133:2181,192.168.145.134:2181";// 2000毫秒private int sessionTimeout = 2000;private ZooKeeper zkClient;private String node;public void getConnect() throws IOException {zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {}});}// 注册public void register() throws KeeperException, InterruptedException {// 创建一个带序号的临时节点// 提前创建好 /servers 节点node = zkClient.create("/servers/server", null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println("服务器 " + node + " 注册成功");}// 断开连接public void close() throws InterruptedException {System.out.println("服务器 " + node + " 下线");zkClient.close();}}
    
  3. 测试方法示例代码DistributeTest.java

    package xin.yangshuai.zookeeper01.case1;import org.apache.zookeeper.KeeperException;import java.io.IOException;public class DistributeTest {public static void main(String[] args) throws InterruptedException, IOException, KeeperException {// 启动客户端,连接zookeeper,客户端设置监听DistributeClient client = new DistributeClient();client.getConnect();// 启动服务器1,连接zookeeperDistributeServer server1 = new DistributeServer();server1.getConnect();// 启动服务器2,连接zookeeperDistributeServer server2 = new DistributeServer();server2.getConnect();Thread.sleep(5000);// 服务器1上线server1.register();Thread.sleep(5000);// 服务器2上线server2.register();Thread.sleep(5000);// 服务器1下线server1.close();Thread.sleep(5000);// 服务器2下线server2.close();Thread.sleep(Long.MAX_VALUE);}
    }
    
  4. 可以只启动客户端,保持运行状态。用命令行模拟服务端

  5. 仅供参考

参考资料

  • 尚硅谷

http://www.ppmy.cn/server/108258.html

相关文章

20240827软考架构-------软考76-80答案解析

每日打卡题76-80 76、【2012年真题】 难度&#xff1a;一般 基于场景的架构分析方法(Scenarios-based Architecture Analysis Method&#xff0c;SAAM)是卡耐基梅隆大学软件工程研究所的Kazman等人于1983年提出的一种非功能质量属性的架构分析方法&#xff0c;是最早形成文档并…

清除系统缓存提高写盘速度的tips

sync; echo 3 > /proc/sys/vm/drop_caches 上面是一个常用于 Linux 系统的命令组合&#xff0c;主要用于清理内存中的缓存。下面是对这条命令的详细解释&#xff1a; sync sync 命令用于将所有未写入磁盘的缓存数据写入磁盘。Linux 操作系统会将一些数据保存在内存中&#x…

国内券商有没有提供股票程序化交易接口的

国内券商股票程序化交易接口概述 股票程序化交易在金融市场中日益重要&#xff0c;而国内券商在这方面的服务和接口提供情况备受关注。 券商提供的接口方式 券商提供的接口方式多种多样。有些券商提供自研系统&#xff0c;如国信的云核用 C编程&#xff0c;速度较快但入门门…

OpenGuass under Ubuntu_22.04 install tutorial

今天开始短学期课程&#xff1a;数据库课程设计。今天9点左右在SL1108开课&#xff0c;听陈老师讲授了本次短学期课程的要求以及任务安排&#xff0c;随后讲解了国产数据库的三层架构的逻辑。配置了大半天才弄好&#xff0c;放一张成功的图片&#xff0c;下面开始记录成功的步骤…

okhttp异步请求连接阻塞问题排查

表现&#xff1a; 使用okhttp请求外部大模型接口时&#xff0c;当并发在2-5左右&#xff0c;出现请求被阻塞在建立http连接之前&#xff0c;阻塞时间超长&#xff08;>20s&#xff0c;从日志看有160s存在&#xff09;。但是httpconfig的connTimeout时间配置为100s&#xff…

git命令

git checkout -b new-feature [从更新后的master分支创建新的分支] git pull origin master [同步远端master分支&#xff0c;将远程主机的最新内容拉下来后直接合并] [git pull git fetch git merge] git checkout master [切换分支] git fetch origin [更新所有远端分支…

Android原生JobSchedulerContext内存泄漏导致设备重启的现象

一、现象&#xff1a;原生JobSchedulerContext内存泄漏占比 JobServiceContext内存泄露导致ServiceDispatcher也跟着一起内存堆积 二、现象日志&#xff1a; 内存泄漏的日志关键信息&#xff1a;ActivityManager: Unbind failed: could not find connection for android.app.…

【C/C++】C++类与对象基本概念(抽象封装、类的定义与使用、构造函数、析构函数、静态成员、友元)

目录 七、类与对象基本概念7.1 抽象7.2 类的定义与声明7.3 访问控制7.4 类的实现与使用7.5 对象指针、this指针与对象引用7.6 构造函数7.7 析构函数7.8 拷贝构造函数7.9 类类型作为函数参数7.10 对象数组7.11 静态成员7.12 常对象与常成员&#xff08;const&#xff09;7.13 友…