利用zookeeper实现简单的配置中心

zookeeper特性:

1. 可以直接存储数据的类unix目录节点

2. 通知和监听机制

 

演示:

这里我们使用zookeeper单机环境。虚拟机下载配置好zookeeper之后,在bin目录下

使用  .zkServer.sh start开启服务端

然后 执行.zkCli.sh start开启客户端

我们先用  ls / 查看/下的节点

使用命令新建一个znode节点:  create /helloworld  today

这样等于新建了一个存储 "today"字符串的  /helloworld 节点

 

然后,我们在IDE中 pom.xml中引入依赖: 

  <dependency>

            <groupId>org.apache.zookeeper</groupId>

            <artifactId>zookeeper</artifactId>

            <version>3.6.0</version>

   </dependency>

 

这里版本最好跟你虚拟机中的服务端版本保存一致,避免意外bug

 

新建一个类ZooTest实现zookeeper的Watcher接口,这里重点是process(WatchedEvent event)的具体实现

当zk连接成功或服务端的节点数据发生变动时,都会触发process方法, 在这里处理如下:

代码实现:

package com.example.demo.zoo;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.ZooKeeper;

import org.apache.zookeeper.data.Stat;



import java.io.IOException;

import java.util.concurrent.CountDownLatch;



/**

 *

 * 分布式注册中心demo

 */

public class ZooTest implements Watcher {



    private static ZooKeeper zk = null;

    private static Stat stat = new Stat();

    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {



        String path = "/helloworld";

        zk = new ZooKeeper("192.168.237.128:2181", 5000, new ZooTest());

        connectedSemaphore.await();

        System.out.println("获取到配置值为: "+new String(zk.getData(path,true,stat)));

        Thread.sleep(Integer.MAX_VALUE);

    }







    @Override

    public void process(WatchedEvent watchedEvent) {

        //zk连接成功

        if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {

            if (Event.EventType.None == watchedEvent.getType() && null == watchedEvent.getPath()) {

                connectedSemaphore.countDown();

            } else if (watchedEvent.getType() == Event.EventType.NodeDataChanged) { //zk目录节点数据变化通知事件

                try {

                    System.out.println("配置已修改,新值为: "+new String(zk.getData(watchedEvent.getPath(),true,stat)));

                } catch (KeeperException e) {

                    e.printStackTrace();

                } catch (InterruptedException e) {

                    e.printStackTrace();

                }



            }

        }

    }

}

运行结果:

利用  上面的zkCli 客户端修改 /helloworld为 tomorrow,

 观察终端结果:

这个也是zookeeper服务注册中心的基础

可能会有同学出现终端连接问题,这里最简单的方法就是 关掉虚拟机的防火

发布了11 篇原创文章 · 获赞 9 · 访问量 4564
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览