动态感知服务器上下线
来源:互联网 发布:matlab模块化编程 编辑:程序博客网 时间:2024/06/05 04:08
通过zookeeper完成动态感知分布式服务器上下线的功能
- 通过zookeeper完成动态感知分布式服务器上下线的功能
- 业务描述
- 服务器端的实现
- 客户端的实现
- 测试
- 通过zookeeper完成动态感知分布式服务器上下线的功能
业务描述
- 某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。当主节点下线的时候,客户端会收到通知,并更新目前在还在线的主节点host信息,可以防止客户端向已经挂掉的节点进行请求。
服务器端的实现
要想完成上述功能,在我们可以想到通过zookeeper的短暂态的节点完成,在服务器启动的时候,我们连接到zookeeper并向其注册一个短暂态的节点,当服务器因为某种意外宕机的时候,这个节点也会被删除,这样客户端访问所有的注册节点的信息,就是仍然在正常工作的主节点。
服务器端的代码如下:
import java.io.IOException;import org.apache.zookeeper.CreateMode;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooDefs.Ids;import org.apache.zookeeper.ZooKeeper;public class ClusterServer { //zookeeper的ip与端口,这里是zookeeper是一个集群private String ZK_SERVER_LIST = "mini1:2181,mini2:2181,mini3:2181";//设置超时时间,当主节点2s后没反应就认该节点已经挂了private static final int sessionTimeout = 2000;//所有的注册节点信息当道/servers下面,方便管理private String SERVER_DIR = "/servers";private ZooKeeper zk;public void connect() throws IOException { zk = new ZooKeeper(ZK_SERVER_LIST, sessionTimeout, new Watcher() { //当zookeeper服务器集群有断线时会调用 @Override public void process(WatchedEvent event) { // TODO Auto-generated method stub System.out.println(event.toString()); } });}public void register(String hontname) throws IOException, KeeperException, InterruptedException { //创建瞬时态且带序号的节点,这样在节点下线后该节点就会被删除 String result = zk.create(SERVER_DIR+"/server", hontname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); System.out.println("创建结果:"+result);}public void diy(){ System.out.println("just do it"); try { Thread.sleep(Integer.MAX_VALUE); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }}public static void main(String[] args) throws IOException, KeeperException, InterruptedException { ClusterServer server =new ClusterServer(); server.connect(); server.register(args[0]); server.diy();}}
程序启动的时候就向服务器把当前主节点的host信息注册到zookeeper中。
这里的hostname本来可以通过java api进行动态获取的,不过为了方便实验就省略了。
客户端的实现
客户端所需要的工作是获取正常工作的主节点并且当主节点发生变化的时候可以收到信息,获取最新的正常工作的主节点。所以我们可以对
servers
下面的子节点信息进行监听,代码实现
import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.zookeeper.KeeperException;import org.apache.zookeeper.WatchedEvent;import org.apache.zookeeper.Watcher;import org.apache.zookeeper.ZooKeeper;public class ClusterClient {private String ZK_SERVER_LIST = "mini1:2181,mini2:2181,mini3:2181";private static final int sessionTimeout = 2000;private String SERVER_DIR = "/servers";private ZooKeeper zk;private List<String> servers=new ArrayList<>();public void connect() throws IOException { zk = new ZooKeeper(ZK_SERVER_LIST, sessionTimeout, new Watcher() { @Override public void process(WatchedEvent event) { System.out.println(event.toString()); try { //收到通知后再次对服务器设置监听。 getServerList(); System.out.println(servers); } catch (KeeperException | InterruptedException e) { } } });} //获取服务器列表并设置监听public void getServerList() throws KeeperException, InterruptedException{ List<String> nodeList = zk.getChildren(SERVER_DIR,true); servers.clear(); for(String node:nodeList){ byte []data = zk.getData(SERVER_DIR+"/"+node, false, null); String hostName = new String(data); servers.add(hostName); }} //做自己爱做的事同时完成守护进程的功能public void diy(){ new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true){ } } }).start();;}public static void main(String[] args) throws IOException, KeeperException, InterruptedException { ClusterClient client =new ClusterClient(); client.connect(); client.getServerList(); client.diy();}}
测试
我们可以在多个终端分别运行服务器程序,用来模拟多个主节点,直接关闭终端模仿主节点的宕机。
实验结果如下(当我们动态增加节点的结果):
所有需要的jar包在zookeeper的解压包里面都有。或者直接在我的github里面有代码以及jar包。
阅读全文
0 0
- 动态感知服务器上下线
- zookeeper 服务器动态上下线感知
- 通过Zookeeper动态感知服务器上下线[案例]
- ZooKeeper分布式应用系统服务器上下线动态感知简单程序
- 分布式应用系统服务器上下线动态感知程序开发学习笔记
- zookeeper实现分布式应用系统服务器上下线动态感知程序、监听机制与守护线程
- 利用zookeeper实现分布式运用服务器上下线的动态感知-简单程序
- 【ZooKeeper】分布式系统服务器上下线自动感知程序开发
- zookeeper实时感知到主节点服务器的上下线
- 学习笔记:Zookeeper 应用案例(上下线动态感知)
- 动态上下线datanode节点及副本均衡机制
- 基于Nginx dyups模块的站点动态上下线
- hadoop & hbase 上下线
- xmpp 好友上下线
- 新版Lua服务器下线处理
- Zookeeper应用:服务端上下线
- 大主播 上下线通知 程序
- 动态规划感知
- 重载和重写的底层实现
- [Leetcode] 342. Power of Four 解题报告
- 2017 多校赛6 Kirinriki hdu 6103
- Java学习笔记—String的用法
- go语言之go run/build/install/get
- 动态感知服务器上下线
- B
- opengl光照之聚光灯
- Java String面试题
- 手机淘宝的客户端架构探索之路
- Android 动态解析布局,实现制作多套主题
- 软件版本控制流程
- ps快速制作双重曝光效果
- indexedDB存储