在实际的生产环境中我们一般都是集群环境部署的,同一个程序我们会部署在相同的几台服务器中,这时我们可以通过负载均衡服务器去调度,但是我们并不能很快速的获知哪台服务器挂掉了,这时我们就可以使用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实现动态感知服务器上下线相关推荐

  1. 通过Zookeeper动态感知服务器上下线[案例]

    https://blog.csdn.net/USTC_Zn/article/details/54974982 主体思路: 服务器端:服务器上线.在zookeeper创建 临时的序列化结点 客户端:已启 ...

  2. Mosquitto感知客户端上下线的方法

    欢迎加入QQ群:221779856,国内最活跃的Mosquitto沟通社区,关于MQTT.Mosquitto.IM.推送系统.物联网.高并发处理等技术. 设备上下线的通知不属于mqtt协议的一部分,m ...

  3. Zookeeper应用:服务端上下线

    需求 客户端感知服务器的上下线. 示意图 步骤 服务端: 1.所有机子向Zookeeper注册,注册znode为临时的. 2.有机子下线,连接断开后被Zookeeper自动删除,触发监听事件. 3.有 ...

  4. zookeeper实现动态获取服务器列表代码示例(服务上下线监听/动态更新服务列表)

    分别上线server01,server02,server03,server04, 客户端程序会获取到服务列表得数量为4,再下线server04, 客户端会获得最新的列表数量为3.

  5. ipa 修改服务器地址,动态更改服务器上的.ipa文件

    正如已经指出,你可以简单地解压缩和重新压缩创建自己的ipa. 您还需要添加一些不需要代码签名的资源. 最好的办法是在ipa中创建一个新的(空的)目录.目录本身没有签名,但在设备上解压,可以通过您的代码 ...

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

    1.Zookeeper 应用案例(上下线动态感知) 8.1 案例1--服务器上下线动态感知 8.1.1 需求描述 某分布式系统中,主节点可以有多台,可以动态上下线 任意一台客户端都能实时感知到主节点服 ...

  7. Zookeeper——服务器动态上下线、客户端动态监听

    文章目录: 1.前言 2.实操步骤 2.1 服务端代码 2.2 客户端代码 2.3 测试 1.前言 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线. ...

  8. zookeeper实现服务器动态上下线,分布式锁

    通过前面的Zookeeper学习,我做了几个例子来巩固以下: 1.服务器动态上下线 需求:app client可以感知到app server的上下线(app client和app server是指我们 ...

  9. Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决

    Zookeeper服务器动态上下线idea上server类中server.regist(args[0])数组越界解决 运行server服务类时报错:Exception in thread"m ...

  10. 分布式服务动态上下线感知

    分布式服务动态上下线感知 首先,我们要从解决问题的角度得知分布式服务的由来,从单机服务到分布式服务经历了哪些过程 起初,服务是比较单一的,在一个工程包之中会包含所有的模块,但随着互联网的快速发展,客户 ...

最新文章

  1. 专家也要小心,HTTPS网址的网站就一定安全吗?
  2. 在octopress中增加“返回顶部”按钮
  3. linux 音频路径,Linux系统中提取DVD音频的方法介绍(转)
  4. linux正则表达有话说
  5. java中Protobuf的使用实例
  6. laravel框架中引入Workerman
  7. linux下的node.js下载和安装
  8. Eigen官网教程(6) Map类
  9. shell判端mysql数据库是否存在_Shell脚本检测和检查mysql数据库是否存在坏表
  10. Flocker 做为后端存储代理 docker volume-driver 支持
  11. python剑指offer剪绳子
  12. 前景检测算法(六)--平均背景原理
  13. 全网、全国最好用的基于经纬度的天气查询、天气预报接口
  14. hdu 1862 hdoj 1862
  15. 计算机无限开机,电脑开机无限循环重启
  16. uni-app 点击生成海报
  17. 内容过于真实,可能会引起不适-----程序员去面试的梗!面试官:“哦了,明天来上班吧”
  18. 【百度之星2014~初赛(第二轮)解题报告】JZP Set
  19. 湘潭2017 ccpc中南地区邀请赛 Determinant 高斯约当求逆矩阵
  20. 一个汉字包括几个字符,几个字节?一个字母呢?

热门文章

  1. 远程主机强迫关闭了一个现有的连接
  2. MongoDB与物联网应用讲座
  3. Java日期时间主要API:java.time.Duration类和java.time.Period类
  4. 虾皮的注册流程是什么?怎么注册虾皮?
  5. 了解BigDecimal常用坑,不迷路
  6. Python从入门到自闭(网络篇)
  7. outlook 发送邮件
  8. 螃蟹辞职 大数据冲击网络社交 魔兽世界如何前进
  9. 对序列化器、“对象”的理解
  10. 怎样设定目标(一)目标金字塔