apache curator API操作(创建读取修改删除)zookeeper实战

目前主流有三种zookeeper客户端去操作zookeeper,即zookeeper shell、zookeeper原生zookeeper API、apache curator API。 curator作为一个apache顶级项目,是目前为止最好用的操作zookeeper的(第三方)客户端,其在原生zookeeper API基础上经过封装改造而来,具有易用友好的fluent风格。
相比于原生zookeeper API,curator的易用友好特点表现在:

  • curator客户端可以递归创建删除节点(原生zookeeper API创建节点时需要代码显式地逐级创建父节点,删除节点时需要代码显式地逐级删除子节点);
  • curator客户端具有自动重连session机制;
  • curator的watcher可以触发多次(原生zookeeper API只能触发一次,触发后若要继续监听需要再次设定watcher);
  • 其他。

关于zookeeper原生zookeeper API操作zookeeper节点可以参考博客:
https://www.jianshu.com/p/99bd28aad4e6

curator框架包含多个依赖jar,开发人员可以根据自身的设计需求来选择,各依赖jar之间的关系如下:


curator框架各种依赖jar的关系

从上图可知,curator-recipe(菜单)依赖包含了大多数的应用场景,本文就以curator-recipe依赖包作为例子。

pom.xml中添加依赖:

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.0</version>
        </dependency>

完整Java 程序:

/**
 * curator操作zookeeper的工具类
 **/
package com.example.curatorzkaccess;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class CuratorTest {

    Logger logger = LoggerFactory.getLogger(CuratorTest.class);


    // 初始化curator client
    public CuratorFramework initCuratorClient(String connectString, String namespace){
        // namespace是指根节点,重试策略:重试3次每次间隔10s
        //  创建的节点路径:/namespace/given-path
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(connectString)
                .namespace(namespace)
                .sessionTimeoutMs(6000)
                .connectionTimeoutMs(6000)
                .retryPolicy(new RetryNTimes(3, 10))
                .build();
    return curatorFramework;
    }


    // 创建节点
    public void createNode(CuratorFramework curatorClient, String path, String jsonStr) throws Exception {
        // 必须先保证节点不存在
        if (curatorClient.checkExists().forPath(path) == null){
            // 递归创建节点
            curatorClient.create().creatingParentsIfNeeded().forPath(path, jsonStr.getBytes());
        }
        else {
            logger.warn(String.format("node already existed:[%s]", path));
        }
      }


    // 读取节点数据
    public byte[] getNodeData(CuratorFramework curatorClient, String path) throws Exception {
       byte[] data = null;
       if (curatorClient.checkExists().forPath(path) != null){
           data = curatorClient.getData().forPath(path);
       }
       else {
           logger.warn(String.format("node does not exists:[%s]", path));
       }
       return data;
    }



    //  修改节点数据
    public void setNodeData(CuratorFramework curatorClient, String path, String jsonStr) throws Exception {
        // 必须先保证节点存在
        if(curatorClient.checkExists().forPath(path) != null){
            curatorClient.setData().forPath(path, jsonStr.getBytes());
        }
        else{
            logger.warn(String.format("node does not exists:[%s]", path));
        }
    }



    // 删除节点
    public void deleteNode(CuratorFramework curatorClient, String path) throws Exception {
        // 必须先保证节点存在
        if(curatorClient.checkExists().forPath(path) != null) {
            // 递归删除节点
            curatorClient.delete().deletingChildrenIfNeeded().forPath(path);
        }
        else {
            logger.warn(String.format("node does not exists:[%s]", path));
        }
    }
}





/**
 * 主类
 **/
package com.example.curatorzkaccess;

import org.apache.curator.framework.CuratorFramework;

public class CuratorMain {

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

        String connectString = "localhost:2182";
        String namespace = "datalake";
        String path = "/metadb/tenant1/meta/instance1/schema1/table1";
        String path2 = "/metadb/tenant1/meta/instance1/schema1/table2";
        String jsonString = "{name:test}";
        CuratorTest curatorTest = new CuratorTest();
        CuratorFramework curatorClient = curatorTest.initCuratorClient(connectString, namespace);
        // 启动curator client访问zookeeper server的session
        curatorClient.start();
        curatorTest.createNode(curatorClient, path, jsonString);
        curatorTest.createNode(curatorClient, path2, jsonString);
        curatorTest.deleteNode(curatorClient, path);
        curatorTest.setNodeData(curatorClient, path2, jsonString);
        System.out.println(new String(curatorTest.getNodeData(curatorClient, path2), "UTF-8"));
        // 关闭session
        curatorClient.close();
    }


}


执行结果:

在zookeeper shell中查询节点:
[zk: localhost:2181(CONNECTED) 1] get /datalake/metadb/tenant1/meta/instance1/schema1/table2 
{name:test}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,843评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,538评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,187评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,264评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,289评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,231评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,116评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,945评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,367评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,581评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,754评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,458评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,068评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,692评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,842评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,797评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,654评论 2 354