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 应用案例(上下线动态感知)相关推荐

  1. Apollo星火计划学习笔记——第六讲上自动驾驶感知基础(I)

    文章目录 1. 感知的作用 2. 常见传感器 2.1 相机 2.1.1 相机的种类 2.1.2 相机的特点 2.2 激光雷达 2.2.1 激光雷达系统构成与方案 2.2.2 激光雷达光源 2.2.3 ...

  2. React学习笔记:入门案例

    React学习笔记:入门案例 React 起源于 Facebook 内部项目,因为市场上所有 JavaScript MVC 框架都不令人满意,公司就决定自己写一套,用来架设 Instagram 的网站 ...

  3. java基本语法心得_Java学习笔记(一)——基础语法(上)

    Java学习笔记(一)--基础语法(上) 软件构造 写在前面 编写Java程序时,应注意以下几点:大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的 ...

  4. 【BI学习笔记】在Linux上安装Wyn Enterprise商业智能报表服务器

    [BI学习笔记]在Linux上安装Wyn Enterprise商业智能报表服务器 在百度文库上找来的,放到这里,避免以后丢了. 葡萄城出品的Wyn Enterprise商业智能软件的设计器和查看视图是 ...

  5. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  6. web三维gis引擎cesium的学习笔记(包含视频融合和动态纹理)

    文章目录 web三维gis引擎cesium的学习笔记(包含视频融合和动态纹理) Cesium.Viewer 坐标系 位置方向 官方api文档及示例 Entity API Primitives API ...

  7. 学习笔记(二):WiFi-无接触感知与菲涅尔区

    学习笔记(二):WiFi-无接触感知与菲涅尔区 <毫米级的 Wi-Fi 无接触感知:从模式到模型>笔记 整体总结:   本文在理论上揭示和评估什么样的人体行为可被检测以及何时被检测到.具体 ...

  8. 【学习笔记】kaggle案例之泰坦尼克号(基于R)

    kaggle案例之泰坦尼克号(基于R) 泰坦尼克号案例 数据预处理 决策树模型建立 泰坦尼克号案例 泰坦尼克号数据集为1912年泰坦尼克号撞击冰山沉没事件中一些乘客和船员的个人信息及是否幸存的状况.可 ...

  9. C# 学习笔记入门篇(上)

    文章目录 C# 学习笔记入门篇 〇.写在前面 Hello World! 这篇学习笔记适合什么人 这篇学习笔记到底想记什么 附加说明 一.命名空间 "进入"命名空间 嵌套的命名空间. ...

最新文章

  1. jQuery实现自动左右滚动效果的代码实例
  2. Tween 若干年后我尽然还要学数学 曲线到底是什么鬼啊
  3. Eclipse中10个最有用的快捷键组合(转)
  4. destools php_php DES加密算法实例分析
  5. centos mysql-5.5.20_mysql-5.5.20+CentOS 6.2 编译安装全过程详解(2)
  6. 数据挖掘:模型选择——K-means
  7. 美赛2018b题O奖论文学习(一)
  8. java制作qq机器人(脚本实现和调用QQ官方api实现)
  9. Photoshop平面设计:网页设计之论摹仿和抄袭——xiame.com
  10. HECTF2021-WP集合
  11. html怎样使用ui套件,weui框架组件小白入门指南:如何安装使用weui.js?
  12. Cadence PCB仿真使用Allegro PCB SI 创建含差分对网络元器件的IBIS模型图文教程
  13. 面试蚂蚁金服(意外拿到offer)分享四面经历,从线程锁到数据库
  14. 你们程序员为什么不靠自己的项目谋生?而必须为其他人打工?
  15. 阿里面试其实也没想象中的那么难,秋招提前批4面拿到21K
  16. hiredis中lua脚本调用
  17. 固态硬盘对游戏运行的帮助有多少
  18. 汇编程序中的符号或标号地址
  19. Gemini.Workflow 双子工作流入门教程二:定义流程:流程节点介绍
  20. 使用enaBrowserTools和Aspera从ENA下载数据

热门文章

  1. python批量做线性规划(每次的约束条件参数有变换)
  2. VTK:可编程字形过滤器用法实战
  3. wxWidgets:内存检查示例
  4. boost::system::errc相关的测试程序
  5. boost::mp11::mp_remove相关用法的测试程序
  6. boost::mp11::mp_map_keys相关用法的测试程序
  7. boost::hana::remove用法的测试程序
  8. boost::gil::is_planar用法的测试程序
  9. GDCM:读取显式长度SQIVR的测试程序
  10. Boost:circular_buffer作为边界缓冲区的基础容器