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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,182元/月
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
云原生网关 MSE Higress,422元/月
简介: 1、Zookeeper 应用案例(上下线动态感知)8.1 案例1——服务器上下线动态感知8.1.1 需求描述某分布式系统中,主节点可以有多台,可以动态上下线任意一台客户端都能实时感知到主节点服务器的上下线8.1.2 设计思路8.1.3 代码开发1、客户端实现package cn.com.toto.zkonlineoroffline;   import java.u

1、Zookeeper 应用案例(上下线动态感知)

8.1 案例1——服务器上下线动态感知

8.1.1 需求描述

某分布式系统中,主节点可以有多台,可以动态上下线

任意一台客户端都能实时感知到主节点服务器的上下线

8.1.2 设计思路

8.1.3 代码开发

1、客户端实现

package cn.com.toto.zkonlineoroffline;

 

import java.util.ArrayList;

import java.util.List;

 

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

 

public class DistributedClient {

    private static final String connectString = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181";

    private static final int sessionTimeout = 2000;

     private static final String parentNode = "/servers";

     // 注意:加volatile的意义何在?

     private volatile List<String> serverList;

     private ZooKeeper zk = null;

 

     /**

      * 创建到zk的客户端连接

      *

      * @throws Exception

      */

     public void getConnect() throws Exception {

         zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {

              @Override

              public void process(WatchedEvent event) {

                   // 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)

                   try {

                       //重新更新服务器列表,并且注册了监听

                       getServerList();

 

                   } catch (Exception e) {

                   }

              }

         });

     }

 

     /**

      * 获取服务器信息列表

      *

      * @throws Exception

      */

     public void getServerList() throws Exception {

         // 获取服务器子节点信息,并且对父节点进行监听

         List<String> children = zk.getChildren(parentNode, true);

 

         // 先创建一个局部的list来存服务器信息

         List<String> servers = new ArrayList<String>();

         for (String child : children) {

              // child只是子节点的节点名

              byte[] data = zk.getData(parentNode + "/" + child, false, null);

              servers.add(new String(data));

         }

         // 把servers赋值给成员变量serverList,已提供给各业务线程使用

         serverList = servers;

        

         //打印服务器列表

         System.out.println(serverList);

     }

 

     /**

      * 业务功能

      *

      * @throws InterruptedException

      */

     public void handleBussiness() throws InterruptedException {

         System.out.println("client start working.....");

         Thread.sleep(Long.MAX_VALUE);

     }

    

     public static void main(String[] args) throws Exception {

         // 获取zk连接

         DistributedClient client = new DistributedClient();

         client.getConnect();

         // 获取servers的子节点信息(并监听),从中获取服务器信息列表

         client.getServerList();

 

         // 业务线程启动

         client.handleBussiness();

     }

}

2、服务器端实现

package cn.com.toto.zkonlineoroffline;

 

import java.util.concurrent.CountDownLatch;

 

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.data.Stat;

 

public class DistributedServer {

     private static final String CONNECT_STRING = "192.168.106.80:2181,192.168.106.81:2181,192.168.106.82:2181";

     private static final int SESSION_TIME_OUT = 2000;

     private static final String PARENT_NODE = "/servers";

 

     private ZooKeeper zk = null;

    

     CountDownLatch countDownLatch = new CountDownLatch(1);

 

     /**

      * 创建到zk的客户端连接

      *

      * @throws Exception

      */

     public void getConnect() throws Exception {

         zk = new ZooKeeper(CONNECT_STRING, SESSION_TIME_OUT, new Watcher() {

              @Override

              public void process(WatchedEvent event) {

                   if(event.getState()==KeeperState.SyncConnected){

                       countDownLatch.countDown();

                   }

              }

         });

         countDownLatch.await();

     }

 

     /**

      * 向zk集群注册服务器信息

      *

      * @param hostname

      * @throws Exception

      */

     public void registerServer(String hostname) throws Exception {

         Stat exists = zk.exists(PARENT_NODE, false);

         if(exists==null) zk.create(PARENT_NODE, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

         String path = zk.create(PARENT_NODE + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

         System.out.println(hostname + "is online.." + path);

     }

 

     /**

      * 业务功能

      *

      * @throws InterruptedException

      */

     public void handleBussiness(String hostname) throws InterruptedException {

         System.out.println(hostname + "start working.....");

         Thread.sleep(Long.MAX_VALUE);

     }

 

     public static void main(String[] args) throws Exception {

         DistributedServer server = new DistributedServer();

         // 获取zk连接

         server.getConnect();

 

         // 利用zk连接注册服务器信息(主机名)

         server.registerServer(args[0]);

 

         // 启动业务功能

         server.handleBussiness(args[0]);

     }

}



目录
相关文章
|
消息中间件 分布式计算 负载均衡
ZooKeeper应用案例
【2月更文挑战第24天】
|
人工智能 Serverless 测试技术
nacos常见问题之Serverless 应用引擎2.0不支持 MSE nacos如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
219 0
|
运维 Cloud Native 应用服务中间件
阿里云微服务引擎 MSE 及 API 网关 2024 年 05 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
阿里云微服务引擎及 API 网关 2024 年 5 月产品动态
阿里云微服务引擎及 API 网关 2024 年 5 月产品动态。
964 69
阿里云微服务引擎及 API 网关 2024 年 5 月产品动态
|
人工智能 API
阿里云微服务引擎及 API 网关 2024 年 6 月产品动态
阿里云微服务引擎及 API 网关 2024 年 6 月产品动态
232 91
|
人工智能 API
阿里云微服务引擎及 API 网关 2024 年 4 月产品动态
阿里云微服务引擎及 API 网关 2024 年 4 月产品动态。
502 97
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态
阿里云微服务引擎及 API 网关 2024 年 3 月产品动态。
1149 96
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
173 4
|
消息中间件 Cloud Native 网络安全
云原生最佳实践系列 3:基于 SpringCloud 应用玩转 MSE
该文档介绍了基于云原生应用的产品构建的微服务架构实践。
1047 93
|
分布式计算 NoSQL Java
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
Hadoop-32 ZooKeeper 分布式锁问题 分布式锁Java实现 附带案例和实现思路代码
199 2