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步我们已经验证了,服务消费者可以正常监听节点的变更,现在我们用代码的方式来模拟服务器的上下线

原文地址:https://www.cnblogs.com/riches/p/15160982.html