zoukankan      html  css  js  c++  java
  • zk 08之:Curator之一:zk客户端Curator

    Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端编程。

    它包含以下几个组件:

    Componentdescription
    Recipes Implementations of some of the common ZooKeeper “recipes”. The implementations are built on top of the Curator Framework.
    Framework The Curator Framework is a high-level API that greatly simplifies using ZooKeeper. It adds many features that build on ZooKeeper and handles the complexity of managing connections to the ZooKeeper cluster and retrying operations.
    Utilities Various utilities that are useful when using ZooKeeper.
    Client A replacement for the bundled ZooKeeper class that takes care of some low-level housekeeping and provides some useful utilities.
    Errors How Curator deals with errors, connection issues, recoverable exceptions, etc.
    Extensions The curator-recipes package implements the common recipes that are described in the ZooKeeper documentation. To avoid bloating that package, recipes/applications that have a vertical appeal will be put in separate “extension” packages using the naming convention curator-x-name.

    示例:

    <?xml version="1.0"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.sf.zkclient</groupId>
      <artifactId>zkclient</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>zkclient</name>
      <url>http://maven.apache.org</url>
      <properties>
          <curator.version>2.11.1</curator.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      </properties>
      <dependencies>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.8</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
    
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${curator.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>${curator.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.google.guava</groupId>
                    <artifactId>guava</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
    </dependencies>
    </project>

    java代码:

    示例一:常见的添加、修改、删除示例:

    public static void test() throws Exception {
            String address = "localhost:2181";
            CuratorFramework client = CuratorFrameworkFactory.newClient(address, new ExponentialBackoffRetry(1000, 3));
            
            try{
                client.start();
                
                String path = "/yongjiu2/yongjiu3/test5";
                
                //a. 创建永久性节点
                client.create()
                  .creatingParentContainersIfNeeded()
                  .withMode(CreateMode.PERSISTENT)
                  .withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)
                  .forPath(path, "hello, zk".getBytes());
                System.out.println("b");
                
                //b. 创建临时节点
                client.create().withMode(CreateMode.EPHEMERAL).forPath("/temptest5", "hello".getBytes());  
                
                System.out.println("c");
                //c.获取节点值
                byte[] buf = client.getData().forPath(path);
                System.out.println("get data path:"+path+", data:"+new String(buf));
                
                System.out.println("d");
                //d.设置节点值
                client.setData().inBackground().forPath(path, "ricky".getBytes());
                
                System.out.println("e");
                //e.checkExists
                Stat stat = client.checkExists().forPath(path);
                if(stat==null){
                    System.out.println("exec create path:"+path);
                }else {
                    System.out.println("exec getData");
                }
                
                System.out.println("f");
                //f.删除节点
                client.delete().deletingChildrenIfNeeded().forPath(path);
                
                byte[] buf2 = client.getData().forPath(path);
                System.out.println("get data path:"+path+", data:"+new String(buf2));
                
            }finally {
                if(client!=null)
                    client.close();
            }
        }

    示例二:临时节点不能有子节点、不能级联创建示例:

    /**
         * 级联创建临时节点测试,结果会创建不成功,报错
         * @throws Exception
         */
        public static void test2() throws Exception {
            String address = "localhost:2181";
            CuratorFramework client = CuratorFrameworkFactory.newClient(address, new ExponentialBackoffRetry(1000, 3));
            
            try{
                client.start();
                
                String path = "/linshi";
                
                //b. 创建临时节点
                client.create().withMode(CreateMode.EPHEMERAL).forPath(path, "hello".getBytes());  
                
                byte[] buf = client.getData().forPath(path);
                System.out.println("get data path:"+path+", data:"+new String(buf));
                
                
                //Zookeeper创建临时节点的时候,不能创建级联的节点,下面的create会报错
                String path2 = "/linshi/test";
                //b. 创建临时节点
                client.create().withMode(CreateMode.EPHEMERAL).forPath(path2, "hello".getBytes());  
                
                
                //byte[] buf2 = client.getData().forPath(path2);
                //System.out.println("get data path:"+path2+", data:"+new String(buf2));
                
                
                TimeUnit.SECONDS.sleep(100 * 1000);
            }finally {
                if(client!=null)
                    client.close();
            }
        }

    示例三:3、临时节点何时失效演示(在会话结束时被移除)

    /**
         * 临时节点什么时候失效?是在本次会话结束时
         * @throws Exception
         */
        public static void test3() throws Exception {
            String address = "localhost:2181";
            CuratorFramework client = CuratorFrameworkFactory.newClient(address, new ExponentialBackoffRetry(1000, 3));
            
            try{
                client.start();
                
                String path = "/linshi";
                
                //b. 创建临时节点
                client.create().withMode(CreateMode.EPHEMERAL).forPath(path, "hello".getBytes());  
                
                byte[] buf = client.getData().forPath(path);
                System.out.println("get data path:"+path+", data:"+new String(buf));
                
                TimeUnit.SECONDS.sleep(100 * 1000);
            }finally {
                if(client!=null)
                    client.close();
            }
        }

  • 相关阅读:
    边缘引导插值/方向卷积插值
    cout显示Mat类对象报错Access Violation
    图像特征点匹配C代码
    TF-IDF(词频-逆向文件频率)用于文字分类
    Jsp中如何通过Jsp调用Java类中的方法
    根据wsdl文件,soupUI生成webservice客户端代码
    根据wsdl,axis2工具生成客户端代码
    根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码
    根据wsdl,基于wsimport生成代码的客户端
    Mysql截取和拆分字符串函数用法
  • 原文地址:https://www.cnblogs.com/duanxz/p/2585746.html
Copyright © 2011-2022 走看看