zoukankan      html  css  js  c++  java
  • Hadoop基础(三十六):监听服务器节点动态上下线案例

    1.需求

    某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。

    2.需求分析,如图 5-12 所示

    3.具体实现

    (0)先在集群上创建/servers 节点
    [zk: localhost:2181(CONNECTED) 10] create /servers "servers"
    Created /servers
    (1)服务器端向 Zookeeper 注册代码
    package com.atguigu.zkclient;
    
    import java.io.IOException;
    
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.ZooDefs.Ids;
    
    public class DistributeServer {
        private static final String CONNECTION_STRING = "192.168.1.122:2181,192.168.1.133:2181,192.168.1.144:2128";
        private static final int SESSION_TIMEOUT = 300000;
        private ZooKeeper zk;
        private String parentNode = "/servers";
    
        // 创建到 zk 的客户端连接
        public void getConnect() throws IOException {
            zk = new ZooKeeper(CONNECTION_STRING, SESSION_TIMEOUT, new Watcher() {
    
                @Override
                public void process(WatchedEvent evemt){
                }
            });
        }
        
        // 注册服务器
        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);
        }
    
    
        // 业务功能
        public void business(String hostname) throws Exception{
            System.out.println(hostname + "is working ...");
            Thread.sleep(Long.MAX_VALUE)
    
        }
    
        public static void main(String[] args) throws Exception{
            // 1 获取 zk 连接
            DistributeServer server = new DistributeServer();
            server.getConnect();
    
            // 2 利用 zk 连接注册服务器信息
            server.registerServer(args[0]);
    
            // 3 启动业务功能
            server.business(args[0]);
        }
    }
    (2)客户端代码
    package com.atguigu.zkclient;
    
    import java.io.IOException;
    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 DistributeClient {
        private static final String CONNECTION_STRING = "192.168.1.122:2181,192.168.1.133:2181,192.168.1.144:2128";
        private static final int SESSION_TIMEOUT = 300000;
        private ZooKeeper zk;
        private String parentNode = "/servers";
    
        // 创建到 zk 的客户端连接
        public void getConnect() throws IOException {
            zk = new ZooKeeper(CONNECTION_STRING, SESSION_TIMEOUT, new Watcher() {
                public void process(WatchedEvent event){
                    try {
                        getServerList();
                    } catch (Exception e) {
                        //TODO: handle exception
                        e.printStackTrace();
                    }
                }
            });
        }
    
        // 获取服务器列表信息
        public void getServerList() throws Exception {
            // 1 获取服务器子节点信息,并且对父节点进行监听
            List<String> children = zk.getChildren(parentNode, true);
    
            // 2 存储服务器信息列表
            ArrayList<String> servers = new ArrayList<>();
    
            // 3 遍历所有节点,获取节点中的主机名称信息
            for (String child : children) {
                byte[] data = zk.getData(parentNode + "/" + child, false, null);
                servers.add(new String(data));
            }
    
            // 4 打印服务器列表信息
            System.out.println(servers);
        }
    
        // 业务功能
        public void business() throws Exception {
            System.out.println("client is working ....");
            Thread.sleep(Long.MAX_VALUE);
        }
    
        public static void main(String[] args) throws Exception{
            // 1 获取 zk 连接
            DistributeClient client = new DistributeClient();
            client.getConnect();
    
            // 2 获取 servers 的子节点信息,从中获取服务器信息列表
            client.getServerList();
    
            // 3 业务进程启动
            client.business();
        }
    }
     

    本文来自博客园,作者:秋华,转载请注明原文链接:https://www.cnblogs.com/qiu-hua/p/13352518.html

  • 相关阅读:
    ASP.NET Cache的一些总结分享
    C#中委托和事件的区别实例解析
    [hdu2544]最短路spfa
    [codeforces274b]Zero Tree(树形dp)
    [poj2151]Check the difficulty of problems概率dp
    [poj3071]football概率dp
    [poj3744]Scout YYF I(概率dp+矩阵快速幂)
    [bzoj2440]完全平方数(二分+mobius反演)
    [xdoj1216]子树第k小(dfs序+主席树)
    [xdoj1233]Glory and LCS
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/13352518.html
Copyright © 2011-2022 走看看