zoukankan      html  css  js  c++  java
  • 分布式服务管理zookeeper的java api

    zookeeper是一个分布式服务管理工具,本身具备高可用性,很多知名分布式系统入hadoop、Hbase等都采用zk管理。

    常见的两个应用场景:1、服务的注册与发现  2、集群统一配置

    下面看一下使用java 对zk进行交互的常用api

    首先maven引入:

    <dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.3-beta</version>
    </dependency>
    <dependency>
    <groupId>com.github.sgroschupf</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.1</version>
    </dependency>



    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.serialize.SerializableSerializer;
    import org.apache.zookeeper.CreateMode;
    
    /**
     * @author panteng
     * @description
     * @date 17-5-24.
     */
    public class Zk {
        public static void main(String[] arges) {
            String ZKServers = "10.38.164.80:2181,10.38.164.80:2182,10.38.164.80:2183";
            /**
             * 创建会话
             * new SerializableSerializer() 创建序列化器接口,用来序列化和反序列化
             */
            ZkClient zkClient = new ZkClient(ZKServers, 10000, 10000, new SerializableSerializer());
            System.out.println("conneted ok!");
    
            //订阅节点的子节点变化
            zkClient.subscribeChildChanges("/javaApp", new ZKChildListener());
            String appPath = zkClient.create("/javaApp/api", "javaApp", CreateMode.EPHEMERAL_SEQUENTIAL);
            //输出创建节点的路径
            System.out.println("created path:" + appPath);
            //订阅数据的变化
            zkClient.subscribeDataChanges(appPath, new ZkDataListener());
    
            //读数据
            String str = zkClient.readData(appPath);
            System.out.println(str);
            //写数据
            zkClient.writeData(appPath, "newJavaApp");
            System.out.println(zkClient.readData(appPath));
            //判断节点是否存在
            System.out.println(zkClient.exists("/javaApp/api0000000010"));
    
            try {
                Thread.sleep(20000);
            } catch (Exception e) {
    
            }
        }
    }
    Zk.java
    import org.I0Itec.zkclient.IZkDataListener;
    
    /**
     * @author panteng
     * @description
     * @date 17-5-24.
     */
    public class ZkDataListener implements IZkDataListener {
        /**
         * 节点数据发生变化时 触发此函数
         *
         * @param s 发生变化的节点路径
         * @param o 节点变化后的数据
         * @throws Exception
         */
        @Override
        public void handleDataChange(String s, Object o) throws Exception {
            System.out.println("Change = " + s + "  obj=" + o);
        }
    
        @Override
        public void handleDataDeleted(String s) throws Exception {
            System.out.println("Delete = " + s);
        }
    }
    ZkDataListener
    import org.I0Itec.zkclient.IZkDataListener;
    
    /**
     * @author panteng
     * @description
     * @date 17-5-24.
     */
    public class ZkDataListener implements IZkDataListener {
        /**
         * 节点数据发生变化时 触发此函数
         *
         * @param s 发生变化的节点路径
         * @param o 节点变化后的数据
         * @throws Exception
         */
        @Override
        public void handleDataChange(String s, Object o) throws Exception {
            System.out.println("Change = " + s + "  obj=" + o);
        }
    
        @Override
        public void handleDataDeleted(String s) throws Exception {
            System.out.println("Delete = " + s);
        }
    }
    ZkDataListener

    遍历所有节点

    public static void getAllNodes(ZkClient zkClient, String currentPath) {
            try {
                List<String> stringList = zkClient.getChildren(currentPath);
                for (String str : stringList) {
                    if ("/".equals(currentPath)) {
                        str = currentPath + str;
                    } else {
                        str = currentPath + "/" + str;
                    }
                    System.out.println(str);
                    getAllNodes(zkClient, str);
                }
            } catch (Exception e) {
                if (e.getMessage().indexOf("KeeperErrorCode = NoNode for") > -1) {
                    return;
                }
            }
    
        }
  • 相关阅读:
    springboot中多端口启动(这里也适用于https既443端口)
    Gson的fromJson()方法(从Json相关对象到Java实体或转换成List集合)
    [C++] STL源码中学到的 Traits 编程技法的应用
    【解决问题】UNIAPP、VUE 中DATA 数组更新后页面不同步动态渲染更新
    selenium操作chrome时的一些配置
    在react项目中使用fetch 和 JWT进行权限验证(转)
    滚动条的设置(样式包括宽度,颜色等)zhuan
    css3 box-shadow阴影(外阴影与外发光)图示讲解(zhuan)
    js 截断字符串 超过几个字加...
    create-react-app 打包部署
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/6913135.html
Copyright © 2011-2022 走看看