Zookeeper应用:服务端上下线


需求

客户端感知服务器的上下线。


示意图


步骤

服务端:

1、所有机子向Zookeeper注册,注册znode为临时的。

2、有机子下线,连接断开后被Zookeeper自动删除,触发监听事件。

3、有机子上线,触发监听事件。


客户端:

1、连接Zookeeper,获取服务器注册的znode,getchildren(),并注册监听。

2、当Zookeeper触发监听,会rpc远程调用process。

3、process调用getchildren().


服务端代码

package hello.zookeeper.schange;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;public class Server {private String connUrl = "zk1:2181,zk2:2181,zk3:2181";private int outTime = 1000;private String parentNode="/servers/";//Zookeeper先建好这个持久节点private ZooKeeper zk = null;public void getConnection() throws Exception {zk = new ZooKeeper(connUrl, outTime, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("Server Watcher:" + event.getType() + "---" + event.getPath());}});}public void registerServer(String server) throws Exception {String msg = zk.create(parentNode+server, server.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println("registerServer:" + msg);}public static void main(String[] args) throws Exception {String name = "server4";Server server = new Server();server.getConnection();server.registerServer(name);System.out.println(name + "----start------");Thread.sleep(Long.MAX_VALUE);}}


客户端代码

package hello.zookeeper.schange;import java.util.List;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;public class Client {private String connUrl = "zk1:2181,zk2:2181,zk3:2181";private int outTime = 1000;private String parentNode="/servers";private ZooKeeper zk = null;public void getConnection() throws Exception {zk = new ZooKeeper(connUrl, outTime, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("Client Watcher:" + event.getType() + "---" + event.getPath());try {getServerList();} catch (Exception e) {e.printStackTrace();}}});}public void getServerList() throws Exception{List<String> children = zk.getChildren(parentNode, true);if(children!=null&&children.size()>0){System.out.println("服务器列表如下:");for(String child:children){System.out.println(child);}}}public static void main(String[] args) throws Exception {Client client=new Client();client.getConnection();client.getServerList();Thread.sleep(Long.MAX_VALUE);}}


运行结果

开了4台服务端,3台客户端



Zookeeper里/servers节点下有4台注册在线的服务器



客户端运行获取服务端列表



服务器下线一台,三个客户端都受到通知




-------------

更多的Java,Angular,Android,大数据,J2EE,Python,数据库,Linux,Java架构师,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539023.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈希表查找失败的平均查找长度_你还应该知道的哈希冲突解决策略

本文首发于 vivo互联网技术 微信公众号 链接&#xff1a;https://mp.weixin.qq.com/s/5vxYoeARG1nC7Z0xTYXELA作者&#xff1a;Xuegui Chen哈希是一种通过对数据进行压缩, 从而提高效率的一种解决方法&#xff0c;但由于哈希函数有限&#xff0c;数据增大等缘故&#xff0c;哈希…

hive 创建访问用户_hive创建角色并赋权

1 角色管理命令1.1 创建角色创建一个新角色&#xff0c;需要 admin 用户执行CREATE ROLE role_name;1.2 删除角色删除一个角色&#xff0c;需要 admin 用户执行DROP ROLE role_name;1.3 显示当前角色显示用户当前角色列表SHOW CURRENT ROLES;1.4 设定角色如果指定了role_name&a…

python 正则替换_5分钟速览Python正则表达式常用函数!五分钟就掌握它!

导读&#xff1a;正则表达式是处理字符串类型的"核武器"&#xff0c;不仅速度快&#xff0c;而且功能强大。本文不过多展开正则表达式相关语法&#xff0c;仅简要介绍python中正则表达式常用函数及其使用方法&#xff0c;以作快速查询浏览。01 Re概览Re模块是python的…

MFC鼠标OnMouseHover使用

ON_WM_MOUSEHOVER消息要生效,要配合ON_WM_MOUSEMOVE一起使用.代码如下:void CYuButton::OnMouseMove(UINT nFlags, CPoint point) {// TODO: 在此添加消息处理程序代码和/或调用默认值TRACKMOUSEEVENT tme { 0 };tme.cbSize sizeof(TRACKMOUSEEVENT);tme.dwFlags TME_HOVER…

oracle 分组_大数据分组怎样才会更快

分组是数据库的常见运算&#xff0c;无论数据如何准备&#xff0c;通常都需要将所有数据遍历。建立索引这时是不起作用的&#xff0c;存储格式才是决定遍历效率的主要因素。数据库中数据的存放虽然是二进制格式的&#xff0c;但普遍IO性能差&#xff0c;库内遍历快&#xff0c;…

java下拉树_参数模板中下拉树级联下拉数据集查询

背景说明在参数表单的制作中会遇到各种各样的需求&#xff0c;如为了方便参数的输入&#xff0c;需要将输入框设计成树状&#xff1b;若参数模板中有两个输入框&#xff0c;每个输入框对应的参数有某种关系&#xff0c;前一个输入框输入参数后&#xff0c;后一个输入框自动关联…

java8 list 行转列_太赞了,Intellij IDEA 竟然把 Java8 的数据流问题这么完美的解决掉了!

使用 IntelliJ IDEA 来帮忙构建你自己的实时模板连接分组《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spr…

线程run方法和start方法的区别

区别 run() 只是一个普通的方法调用&#xff0c;不会开启新的线程。 start() 会开启新的线程&#xff0c;分配新的资源。里面的变量互不影响。 实例 package multithreading;public class MyThread extends Thread {String flag;public MyThread(String flag) {this.flag…

字典的拼接方法

刚看到觉得很简单 试着用 d3 dict1 dict2 就解决了 结果 报类型错误 后来想去遍历 在组合越想越麻烦 下面分享几个方法 d1 {"name":"luoyong","age":36}d2 {"class":"AID1712","start":"python"}方…

python反射、闭包、装饰器_python 闭包装饰器(一)

一、闭包1.举例defouter():x 10def inner(): #内部函数print(x) #外部函数的一个变量returninner#调用inner()函数的方法outer()() #法一fouter()f()#法二注意&#xff1a;inner()是局部变量&#xff0c;在全局范围不可调用(即不能直接调用inner()函数)&#xff0c;但是在法二中…

java list集合自定义排序_Java 通过 Comparator comparing 对 list 自定义 排序

摘要&#xff1a;在日常开发中&#xff0c;经常会用到排序算法&#xff0c;这里记录下日常使用比较多的排序方法&#xff0c;其中包括按指定指定&#xff1a;正序、倒序排序&#xff0c;还有按自定义字段排序的方法&#xff0c;方便日后查看&#xff1b;一&#xff1a;按指定字…

beautifulsoup爬取网页中的表格_用 Python 爬取网页

来自公众号&#xff1a;优达学城Udacity作者&#xff1a;Kerry Parker编译&#xff1a;欧剃作为数据科学家的第一个任务&#xff0c;就是做网页爬取。那时候&#xff0c;我对使用代码从网站上获取数据这项技术完全一无所知&#xff0c;它偏偏又是最有逻辑性并且最容易获得的数据…

Java中Runnable和Thread的区别

概述 Runnable 是接口。 Thread 是类&#xff0c;且实现了Runnable接口。 Thread部分源码 public class Threadimplements Runnable {private static class Caches{static final ConcurrentMap subclassAudits new ConcurrentHashMap();static final ReferenceQueue subcla…

python 神经网络工具_神经网络15分钟入门!使用python从零开始写一个两层神经网络...

本篇是该系列的第三篇&#xff0c;建议在阅读本篇文章之前先看前两篇文章。在本文中将使用python实现之前描述的两层神经网络&#xff0c;并完成所提出的“象限分类”的问题。需要注意的是&#xff0c;虽然标题叫做神经网络15分钟入门&#xff0c;但是到这篇文章&#xff0c;对…

12.3目录结构

目录结构 设计好目录结构 可读性高可维护性高比如一个Foo项目Foo/--- bin/--- foo--- foo/--- tests/--- _init__.py--- test_main.py--- init.py--- main.py---doc--- conf.py---abc.rst--- setup.py--- requirement.txt--- README简要解释一下&#xff1a; bin/:存放项目的一…

pyecharts添加文字_超燃的文字云效果,用Python就能轻松get!

本文转载自公众号&#xff1a;数据森麟(ID&#xff1a;shujusenlin)作者&#xff1a;叶庭云链接&#xff1a;https://blog.csdn.net/fyfugoyfa/ 01 / 词云图词云图是一种用来展现高频关键词的可视化表达&#xff0c;通过文字、色彩、图形的搭配&#xff0c;产生有冲击力地视觉效…

同步关键词synchronized

概述 synchronized是java中的一个关键字&#xff0c;也就是说是Java语言内置的特性。 synchronized( 一个任意的对象&#xff08;锁&#xff09; ){ 代码块中放操作共享数据的代码。 } public synchronized int getIndex() {return 1;}public static synchronized int getN…

python连接mysql用哪个模块_Python连接MySQL数据库之pymysql模块使用

Python3连接MySQL本文介绍Python3连接MySQL的第三方库--PyMySQL的基本使用。PyMySQL介绍PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库&#xff0c;Python2中则使用mysqldb。Django中也可以使用PyMySQL连接MySQL数据库。PyMySQL安装pip install pymysql连接数据…

mysql 创建视图 主键_MySQL数据库基础操作命令,本文助你更上一层楼!

今天介绍的是关于Mysql数据库一些操作的基础命令用户与权限创建用户mysql>create user test identified by BaC321#; 修改密码5.5版本及以前的命令mysql>set password for testpassowrd(!1A2#3); 5.6及以上命令mysql>update mysql.user set authentication_stringpass…

mysql 聚合函数 怎么用在条件里_MySql 中聚合函数增加条件表达式的方法

Mysql 与聚合函数在一起时候where条件和having条件的过滤时机where 在聚合之前过滤当一个查询包含了聚合函数及where条件&#xff0c;像这样的情况select max(cid) from t where t.id<999这时候会先进行过滤&#xff0c;然后再聚合。先过滤出ID《999的记录&#xff0c;再查找…