• Zookeeper(六)Zookeeper实现注册中心【代码实现及解析】


    一、引言

       Zookeeper除了前面文章写的强大功能以外,另外一个常见应用就是注册中心了,比如Dubbo、SpringCloud等都可以使用ZK作为注册中心,那么注册中心为我们的系统做了什么工作呢?我们可以通过一张图片来了解一下。

    二、代码实现

    第1步:创建父节点

      创建出来的父节点用于管理服务节点

    第2步:编写ZK服务端的代码【这里只是以代码的形式来了解ZK的原理,实际ZK已经帮我们做好了注册中心的功能】

    /**
     * 注册中心测试类【服务端】
     *
     * @author 有梦想的肥宅
     * @date 2021/8/19
     */
    public class RegsterServerDemo {
    
        private CuratorFramework curatorFramework;//zk客户端
    
        private final String SERVICES_DEMO = "/serviceDemo";
    
        /**
         * 使用main函数模拟注册中心【ZK】的工作
         */
        public static void main(String[] args) throws Exception {
            RegsterServerDemo server = new RegsterServerDemo();
    
            //1、获取zk连接
            server.getConnect();
    
            //2、注册服务器到zk集群
            server.regist(args[0]);//由于这个是测试类,所以args[0]为从main函数入口传入的主机ip地址【模拟上线一台机器的场景】
    
            //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】
            server.business();
    
        }
    
    
        //1、获取zk连接
        private void getConnect() throws IOException {
            curatorFramework = ZookeeperClientUtil.getCuratorFramework();
        }
    
        //2、注册服务器到zk集群
        private void regist(String hostname) throws Exception {
            //创建临时顺序节点
            curatorFramework.create().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(SERVICES_DEMO + "/" + hostname, hostname.getBytes());
            System.out.println(hostname + "上线了~");
        }
    
        //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】
        private void business() throws InterruptedException {
            Thread.sleep(Long.MAX_VALUE);
        }
    
    }

    第3步:编写ZK服务消费者的代码【模拟服务消费者去感知服务器的上下线】

    /**
     * 注册中心测试类【客户端/服务消费者】
     *
     * @author 有梦想的肥宅
     * @date 2021/8/19
     */
    public class RegsterClientDemo {
    
        private CuratorFramework curatorFramework;//zk客户端
    
        private final String SERVICES_DEMO = "/serviceDemo";
    
        /**
         * 使用main函数模拟客户端通过zk监听服务上下线
         */
        public static void main(String[] args) throws Exception {
            RegsterClientDemo client = new RegsterClientDemo();
    
            //1、获取zk连接
            client.getConnect();
    
            //2、监听/serviceDemo下面子节点的增加和删除【获取可用的服务器列表】
            client.getServerList();
    
            //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】
            client.business();
    
        }
    
        //1、获取zk连接
        private void getConnect() throws Exception {
            curatorFramework = ZookeeperClientUtil.getCuratorFramework();
        }
    
        //2、获取可用的服务器列表
        private void getServerList() throws Exception {
            //服务器列表
            ArrayList<String> servers = new ArrayList<>();
    
            //获取/serviceDemo下的子节点,并添加监听
            List<String> children = curatorFramework.getChildren().usingWatcher(new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    try {
                        //当节点发生变动时,会去调用getServerList()方法获取可用的服务器列表
                        getServerList();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).forPath(SERVICES_DEMO);
    
            //循环获取子节点的值【对应的主机地址】
            for (String child : children) {
                byte[] data = curatorFramework.getData().forPath(SERVICES_DEMO + "/" + child);
                servers.add(new String(data));
            }
    
            //打印
            System.out.println(servers);
        }
    
        //3、模拟ZK持续运行【让线程沉睡,否则执行完上面的代码就结束了,无法看到注册中心效果】
        private void business() throws InterruptedException {
            Thread.sleep(Long.MAX_VALUE);
        }
        
    }

    第4步:启动服务消费者进行监听,以命令行创建节点观察服务消费者的变化

    第5步:启动服务端代码,模拟服务器真实上线

      在第4步我们已经验证了,服务消费者可以正常监听节点的变更,现在我们用代码的方式来模拟服务器的上下线

  • 相关阅读:
    项目总结60:Springboot集成swagger2
    ELK学习01:ELK安装
    Java深入学习16:NIO详解2-Selector
    Java深入学习15:NIO详解1-基本概念、Buffer、Channel
    Java深入学习14:Java线程池
    Java深入学习13:synchronized在静态方法和非静态方法下的同步
    Java深入学习12:线程按目标顺序执行以及Lock锁和Condiiton接口
    项目总结59:Redis分布式锁解决电商订单库存并发问题
    Java深入学习11:Lock锁详解
    Java深入学习09:URL类使用和判断图片资源是否有效
  • 原文地址:https://www.cnblogs.com/riches/p/15160982.html
Copyright © 2020-2023  润新知