zookeeper实现动态感知服务器上下线
在实际的生产环境中我们一般都是集群环境部署的,同一个程序我们会部署在相同的几台服务器中,这时我们可以通过负载均衡服务器去调度,但是我们并不能很快速的获知哪台服务器挂掉了,这时我们就可以使用zookeeper来解决这个问题。
zookeeper的动态感知
动态感知其实利用的就是zookeeper的watch功能,我们先来看下常规的负载均衡服务器的结构
再来看下我们用zookeeper实现的结构
文字描述:
1.感知上线
当服务器启动的时候通过程序知道后会同时在zookeeper的servers节点下创建一个新的短暂有序节点来存储当前服务器的信息。客户端通过对servers节点的watch可以立马知道有新的服务器上线了
2.感知下线
当我们有个服务器下线后,对应的servers下的短暂有序节点会被删除,此时watch servers节点的客户端也能立马知道哪个服务器下线了,能够及时将访问列表中对应的服务器信息移除,从而实现及时感知服务器的变化。
代码实现
服务器端代码
package com.dpb.dynamic;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;/*** 服务器端代码* @author dengp**/
public class DistributedServer {private static final String connectString = "192.168.88.121:2181,192.168.88.122:2181,192.168.88.123:2181";private static final int sessionTimeout = 2000;private static final String parentNode = "/servers";private ZooKeeper zk = null;/*** 创建到zk的客户端连接* * @throws Exception*/public void getConnect() throws Exception {zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {// 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)System.out.println(event.getType() + "---" + event.getPath());try {zk.getChildren("/", true);} catch (Exception e) {}}});}/*** 向zk集群注册服务器信息* * @param hostname* @throws Exception*/public void registerServer(String hostname) throws Exception {String create = zk.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname + "is online.." + create);}/*** 业务功能* * @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 {// 获取zk连接DistributedServer server = new DistributedServer();server.getConnect();// 利用zk连接注册服务器信息server.registerServer(args[0]);// 启动业务功能server.handleBussiness(args[0]);}
}
客户端代码
package com.dpb.dynamic;import java.util.ArrayList;
import java.util.List;import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
/*** 客户端:通过zookeeper获取服务器地址* @author 波波烤鸭**/
public class DistributedClient {private static final String connectString = "192.168.88.121:2181,192.168.88.122:2181,192.168.88.123: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() {@Overridepublic 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();}
}
测试
1.在zookeeper中的/下创建一个servers永久节点
[zk: localhost:2181(CONNECTED) 1] create /servers servers
Created /servers
1.启动三个服务器
再启动另外两个
3.启动一个客户端
4.关闭一个服务器然后在新开一个服务器观察
关掉server01后客户端立马打印如下信息
更新了服务器列表,移除了server01
再开启一个server04服务器查看
客户端获取到了刚刚上线的服务器。
ok~本文到此结束。
zookeeper实现动态感知服务器上下线相关推荐
- 通过Zookeeper动态感知服务器上下线[案例]
https://blog.csdn.net/USTC_Zn/article/details/54974982 主体思路: 服务器端:服务器上线.在zookeeper创建 临时的序列化结点 客户端:已启 ...
- Mosquitto感知客户端上下线的方法
欢迎加入QQ群:221779856,国内最活跃的Mosquitto沟通社区,关于MQTT.Mosquitto.IM.推送系统.物联网.高并发处理等技术. 设备上下线的通知不属于mqtt协议的一部分,m ...
- Zookeeper应用:服务端上下线
需求 客户端感知服务器的上下线. 示意图 步骤 服务端: 1.所有机子向Zookeeper注册,注册znode为临时的. 2.有机子下线,连接断开后被Zookeeper自动删除,触发监听事件. 3.有 ...
- zookeeper实现动态获取服务器列表代码示例(服务上下线监听/动态更新服务列表)
分别上线server01,server02,server03,server04, 客户端程序会获取到服务列表得数量为4,再下线server04, 客户端会获得最新的列表数量为3.
- ipa 修改服务器地址,动态更改服务器上的.ipa文件
正如已经指出,你可以简单地解压缩和重新压缩创建自己的ipa. 您还需要添加一些不需要代码签名的资源. 最好的办法是在ipa中创建一个新的(空的)目录.目录本身没有签名,但在设备上解压,可以通过您的代码 ...
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...
- Zookeeper——服务器动态上下线、客户端动态监听
文章目录: 1.前言 2.实操步骤 2.1 服务端代码 2.2 客户端代码 2.3 测试 1.前言 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. ...
- zookeeper实现服务器动态上下线,分布式锁
通过前面的Zookeeper学习,我做了几个例子来巩固以下: 1.服务器动态上下线 需求:app client可以感知到app server的上下线(app client和app server是指我们 ...
- Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决
Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决 运行server服务类时报错:Exception in thread"m ...
- 分布式服务动态上下线感知
分布式服务动态上下线感知 首先,我们要从解决问题的角度得知分布式服务的由来,从单机服务到分布式服务经历了哪些过程 起初,服务是比较单一的,在一个工程包之中会包含所有的模块,但随着互联网的快速发展,客户 ...
最新文章
- 专家也要小心,HTTPS网址的网站就一定安全吗?
- 在octopress中增加“返回顶部”按钮
- linux 音频路径,Linux系统中提取DVD音频的方法介绍(转)
- linux正则表达有话说
- java中Protobuf的使用实例
- laravel框架中引入Workerman
- linux下的node.js下载和安装
- Eigen官网教程(6) Map类
- shell判端mysql数据库是否存在_Shell脚本检测和检查mysql数据库是否存在坏表
- Flocker 做为后端存储代理 docker volume-driver 支持
- python剑指offer剪绳子
- 前景检测算法(六)--平均背景原理
- 全网、全国最好用的基于经纬度的天气查询、天气预报接口
- hdu 1862 hdoj 1862
- 计算机无限开机,电脑开机无限循环重启
- uni-app 点击生成海报
- 内容过于真实,可能会引起不适-----程序员去面试的梗!面试官:“哦了,明天来上班吧”
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
- 湘潭2017 ccpc中南地区邀请赛 Determinant 高斯约当求逆矩阵
- 一个汉字包括几个字符,几个字节?一个字母呢?