ZooKeeper Java API基本操作-建立连接&增删改查

相关前置文章:
ZooKeeper基础-数据结构、服务端/客户端常用命令

零、本文纲要

一、常见的ZooKeeper Java API
二、Curator常用操作

  • 常用操作
    ①建立连接
    ②添加节点
    ③查询节点
    ④修改节点
    ⑤删除节点

tips:Ctrl+F快速定位到所需内容进行阅读吧。

一、常见的ZooKeeper Java API

  • 原生Java API
  • ZkClient
  • Curator
    Curator官网链接

二、Curator常用操作

  • 1、环境准备
    pom.xml
        
        
            org.apache.curator
            curator-framework
            4.0.0
        

        
            org.apache.curator
            curator-recipes
            4.0.0
        
  • 2、常用操作

①建立连接

四个关键参数:
Ⅰ、connectString 连接字符串 zkServer 地址和端口:"192.168.253.128:2181"
Ⅱ、sessionTimeoutMs 会话超时时间,单位ms
Ⅲ、connectionTimeoutMs 连接超时时间,单位ms
Ⅳ、retryPolicy 重试策略

        //①定义重试策略
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);
        //②获取客户端连接对象
        CuratorFramework client= CuratorFrameworkFactory.builder()
                .connectString("192.168.253.128:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy)
                .namespace("stone").build();
        //③开启连接
        client.start();

设置namespace的作用,相当于每次API操作create /app的时候,系统会补上create /[namespace]/app。

②添加节点

Ⅰ、基本创建
forPath(String path)

        //1.基本创建
        //如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
        String path = client.create().forPath("/app1");
        System.out.println(path);

此处返回值的path是不包含namespace的,但是通过./zkCli.sh上是能查询到包含namespace的新建节点。

控制台.png

另外需要注意的是,API默认会把客户端IP地址值存入到当前节点。

zkCli客户端.png

Ⅱ、创建节点 带有数据
forPath(String path, byte[] data)

        //2.创建节点 带有数据
        String path = client.create().forPath("/app2","hello world".getBytes());

Ⅲ、设置节点类型
withMode(CreateMode mode)
the default is CreateMode.PERSISTENT
常用的四种类型:
PERSISTENT
PERSISTENT_SEQUENTIAL
EPHEMERAL
EPHEMERAL_SEQUENTIAL
需要注意的是:临时节点的生命周期是一次会话内,会话结束临时节点也会被清除。

        //3.设置节点类型
        //默认类型:持久化
        String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");

Ⅳ、创建多级节点
creatingParentContainersIfNeeded()

        //4.创建多级节点 /aap1/p1
        //creatingParentContainersIfNeeded()如果父节点不存在则创建节点
        String path = client.create().creatingParentContainersIfNeeded().forPath("/app4/p1");

③查询节点

Ⅰ、查询数据:get
getData()

        //1.查询数据:get
        byte[] data = client.getData().forPath("/app1");
        System.out.println(new String(data));

Ⅱ、查询子节点:ls
getChildren()

        //2.查询子节点:ls
        List path = client.getChildren().forPath("/app4");
        System.out.println(path);

Ⅲ、查询节点状态信息:ls -s
getData().storingStatIn(status)

        Stat status = new Stat();
        //3.查询节点状态信息:ls -s
        byte[] data = client.getData().storingStatIn(status).forPath("/app1");
        System.out.println(new String(data));

④修改节点

Ⅰ、基本修改数据:setData().forPath()

        client.setData().forPath("/app1", "itcast".getBytes());

Ⅱ、根据版本修改:setData().withVersion().forPath()
多线程并发情形下需要使用此方法

        Stat status = new Stat();
        //3.查询节点状态信息:ls -s
        byte[] data = client.getData().storingStatIn(status).forPath("/app1");

        int version = status.getVersion();//查询版本信息
        client.setData().withVersion(version).forPath("/app1", "itcast".getBytes());

⑤删除节点

Ⅰ、删除单个节点

        //1.删除单个节点
        client.delete().forPath("/app1");

Ⅱ、删除带有子节点的节点

        //2.删除带有子节点的节点
        client.delete().deletingChildrenIfNeeded().forPath("/app1");

Ⅲ、必须成功的删除

        //3.必须成功的删除
        client.delete().guaranteed().forPath("/app1");

Ⅳ、回调

        //4.回调
        client.delete().guaranteed().inBackground(new BackgroundCallback() {
            @Override
            public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
                System.out.println("I am deleted.");
                System.out.println(event);
            }
        }).forPath("/app1");

回调方法中 CuratorEvent 是我们实际业务中回调需要使用到的类,其字段包含:

    private final CuratorEventType type;
    private final int resultCode;
    private final String path;
    private final String name;
    private final List children;
    private final Object context;
    private final Stat stat;
    private final byte[] data;
    private final WatchedEvent watchedEvent;
    private final List aclList;
    private final List opResults;
    //本次操作输出如下:
    CuratorEventImpl{type=DELETE, 
    resultCode=0, 
    path='/app2', 
    name='null', 
    children=null, 
    context=null, 
    stat=null, 
    data=null, 
    watchedEvent=null, 
    aclList=null, 
    opResults=null}

三、结语

以上即为ZooKeeper Java API基本操作的全部内容,感谢阅读。

你可能感兴趣的:(ZooKeeper Java API基本操作-建立连接&增删改查)