Zookeeper入门及实践

 

 

借助代码介绍zookeeper的增删改查和zk的事件机制(Watcher)

 

如何注册事件机制:

通过这三个操作来绑定事件 :getData、Exists、getChildren

如何触发事件?

凡是事务类型的操作,都会触发监听事件。create /delete /setData

watcher 事件类型

None (-1), 客户端链接状态发生变化的时候,会收到 none 的事件

NodeCreated (1), 创建节点的事件。

NodeDeleted (2), 删除节点的事件

NodeDataChanged (3), 节点数据发生变更

NodeChildrenChanged (4); 子节点被创建、被删除、会发生事件

ZK基于 Java API的使用:

 增删改查:

package Zookeeper.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by Csh on 2019/1/12.
 */
public class ZookeeperDemo {

    public static void main(String[] args) {
        final CountDownLatch countDownLatch = new CountDownLatch(1);

        try {
            ZooKeeper zooKeeper = new ZooKeeper("47.93.63.243:2181", 4000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    if(Event.KeeperState.SyncConnected== watchedEvent.getState()){
                        //如果接收到服务端请求, 连接成功
                        countDownLatch.countDown();
                    }
                }
            });
            countDownLatch.await();
            //获得连接的状态
            System.out.println(zooKeeper.getState());
            //添加节点
            zooKeeper.create("/user","hh".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            Thread.sleep(1000);
            Stat stat  = new Stat();
            //得到当前节点的值  当前创建的节点不允许跨层级创建, 必须一个一个创建
            byte[] data = zooKeeper.getData("/user",null,stat);
            System.out.println(new String(data));
//            //修改当前节点的值
            zooKeeper.setData("/user","10".getBytes(),stat.getVersion());

            //得到当前节点的值
            byte[] d = zooKeeper.getData("/user",null,stat);
            System.out.println(new String(d));

            //删除当前节点的值
            zooKeeper.delete("/user",stat.getVersion());
            zooKeeper.close();

            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }

    }



}

 Watcher

package Zookeeper.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * Created by Csh on 2019/1/12.
 */
public class WatcherDemo {

    public static void main(String[] args) {
        final CountDownLatch countDownLatch=new CountDownLatch(1);


        try {
            final ZooKeeper zooKeeper = new ZooKeeper("47.93.63.243:2181", 4000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("默认事件++>>>>>"+watchedEvent.getType());
                    if(Event.KeeperState.SyncConnected== watchedEvent.getState()){
                        //如果接收到服务端请求, 连接成功
                        countDownLatch.countDown();
                    }
                }
            });
            countDownLatch.await();
            //添加节点
            zooKeeper.create("/user","hh".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

            //exists  getdata getchildren

            //通过exists绑定事件通知
            /**
             * 当数据发生变更时, zookeeper会产生一个watcher事件, 并且会发送到客户端, 但是客户端只会收到一次通知, 如果后续节点在发生变化
             * 不会在将收到通知
             */

            Stat stat = zooKeeper.exists("/user", new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println(watchedEvent.getType()+">>"+watchedEvent.getPath());//watcher

                    try {
                        //再一次的进行监听   此时的watch为true 默认使用的是全局的事件
                        zooKeeper.exists(watchedEvent.getPath(),true);
                    } catch (KeeperException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            //通过修改的事务类型操作来触发监听事件
            stat=zooKeeper.setData("/user","2".getBytes(),stat.getVersion());

            Thread.sleep(1000);

            zooKeeper.delete("/user",stat.getVersion());

            System.in.read();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (KeeperException e) {
            e.printStackTrace();
        }
    }
}

基于Curator 客户端的使用:

增删改查:

package Zookeeper.zookeeper.Curator;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;

/**
 * Created by Csh on 2019/1/12.
 */
public class CuratorDemo {
    public static void main(String[] args) {

        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
        .connectString("47.93.63.243:2181").sessionTimeoutMs(4000)
                .retryPolicy(new ExponentialBackoffRetry(1000,3))
                .namespace("user").build();
        curatorFramework.start();

        try {
            //创建节点
            curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/test","1".getBytes());

            Stat stat = new Stat();
            curatorFramework.getData().storingStatIn(stat).forPath("/test");
            curatorFramework.setData().withVersion(stat.getVersion()).forPath("/test","12".getBytes());

            //删除节点
            curatorFramework.delete().deletingChildrenIfNeeded().forPath("/test");

            curatorFramework.close();


        } catch (Exception e) {
            e.printStackTrace();
        }


    }

}

Watcher:

package Zookeeper.zookeeper.Curator;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.retry.ExponentialBackoffRetry;

/**
 * Created by Csh on 2019/1/12.
 */
public class CuratorWatcherDemo {

    public static void main(String[] args) throws Exception {


        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .connectString("47.93.63.243:2181").sessionTimeoutMs(4000)
                .retryPolicy(new ExponentialBackoffRetry(1000,3))
                .namespace("user").build();
        curatorFramework.start();

        //当前节点的创建和删除事件监听
//        addListenerWithNodeCache(curatorFramework,"/test");
        //子节点的增加、修改、删除的事件监听
//        addListenerWithPathChildCache(curatorFramework,"/test");
        //综合节点监听事件
        addListenerWithTreeCache(curatorFramework,"/test");
        System.in.read();
    }




    /**
     * PathChildCache 监听一个节点下子节点的创建、删除、更新
     * NodeCache  监听一个节点的更新和创建事件
     * TreeCache  综合PatchChildCache和NodeCache的特性
     */

    //监听一个节点下自节点的创建删除和更新
    public static void addListenerWithChildCache(CuratorFramework curatorFramework,String path){
        PathChildrenCache pathChildrenCache  = new PathChildrenCache(curatorFramework,path,true);
        PathChildrenCacheListener pathChildrenCacheListener = new PathChildrenCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
                System.out.println(" 接收到---->"+pathChildrenCacheEvent.getType());
            }
        };
        pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);
        try {
            pathChildrenCache.start(PathChildrenCache.StartMode.NORMAL);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void addListenerWithTreeCache(CuratorFramework curatorFramework,String path) throws Exception {
        TreeCache treeCache=new TreeCache(curatorFramework,path);
        TreeCacheListener treeCacheListener=new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                System.out.println(event.getType()+"->"+event.getData().getPath());
            }
        };

        treeCache.getListenable().addListener(treeCacheListener);
        treeCache.start();
    }

    public static void addListenerWithNodeCache(CuratorFramework curatorFramework,String path) throws Exception {
        final NodeCache nodeCache=new NodeCache(curatorFramework,path,false);
        NodeCacheListener nodeCacheListener=new NodeCacheListener() {
            @Override
            public void nodeChanged() throws Exception {
                System.out.println("Receive Event:"+nodeCache.getCurrentData().getPath());
            }
        };
        nodeCache.getListenable().addListener(nodeCacheListener);
        nodeCache.start();
    }


}

 

你可能感兴趣的:(zookeeper)