使用JavaAPI来操作Zookeeper

使用JavaAPI来操作Zookeeper

Curator

Curator是Apache Zookeeper的java客户端,Curator的目标是简化Zookeeper客户端的使用

建立连接

导入对应的Curator对应的坐标

<dependencies>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
        <scope>test</scope>
    </dependency>

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

    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>4.0.0</version>
    </dependency>
    <!--日志-->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.21</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.21</version>
    </dependency>

</dependencies>


<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

在测试中建立连接

 /*
  *
  * @param connectString       连接字符串。zk server 地址和端口 "192.168.149.135:2181,192.168.149.136:2181"
  * @param sessionTimeoutMs    会话超时时间 单位ms
  * @param connectionTimeoutMs 连接超时时间 单位ms
  * @param retryPolicy         重试策略
  */
/* //重试策略
 RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);
 //1.第一种方式
 CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.149.135:2181",
         60 * 1000, 15 * 1000, retryPolicy);*/
 //重试策略
 RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
 //2.第二种方式
 //CuratorFrameworkFactory.builder();
 client = CuratorFrameworkFactory.builder()
         .connectString("192.168.149.135:2181")
         .sessionTimeoutMs(60 * 1000)
         .connectionTimeoutMs(15 * 1000)
         .retryPolicy(retryPolicy)
         .namespace("gwx")
         .build();

 //开启连接
 client.start();

创建节点

/**
 * 创建节点:create 持久 临时 顺序 数据
 * 1. 基本创建 :create().forPath("")
 * 2. 创建节点 带有数据:create().forPath("",data)
 * 3. 设置节点的类型:create().withMode().forPath("",data)
 * 4. 创建多级节点  /app1/p1 :create().creatingParentsIfNeeded().forPath("",data)
 */
@Test
public void testCreate() throws Exception {
    //2. 创建节点 带有数据
    //如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
    String path = client.create().forPath("/app2", "hehe".getBytes());
    System.out.println(path);

}

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

}

@Test
public void testCreate3() throws Exception {
    //3. 设置节点的类型
    //默认类型:持久化
    String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
    System.out.println(path);


}

@Test
public void testCreate4() throws Exception {
    //4. 创建多级节点  /app1/p1
    //creatingParentsIfNeeded():如果父节点不存在,则创建父节点
    String path = client.create().creatingParentsIfNeeded().forPath("/app4/p1");
    System.out.println(path);
}

查询节点

/**
 * 查询节点:
 * 1. 查询数据:get: getData().forPath()
 * 2. 查询子节点: ls: getChildren().forPath()
 * 3. 查询节点状态信息:ls -s:getData().storingStatIn(状态对象).forPath()
 */

@Test
public void testGet1() throws Exception {
    //1. 查询数据:get
    byte[] data = client.getData().forPath("/app1");
    System.out.println(new String(data));
}

@Test
public void testGet2() throws Exception {
    // 2. 查询子节点: ls
    List<String> path = client.getChildren().forPath("/");

    System.out.println(path);
}

@Test
public void testGet3() throws Exception {


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

    System.out.println(status);

}

修改数据

/**
 * 修改数据
 * 1. 基本修改数据:setData().forPath()
 * 2. 根据版本修改: setData().withVersion().forPath()
 * * version 是通过查询出来的。目的就是为了让其他客户端或者线程不干扰我。
 *
 * @throws Exception
 */
@Test
public void testSet() throws Exception {
    client.setData().forPath("/app1", "it".getBytes());
}


@Test
public void testSetForVersion() throws Exception {

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


    int version = status.getVersion();//查询出来的 3
    System.out.println(version);
    client.setData().withVersion(version).forPath("/app1", "hehe".getBytes());
}

删除节点

/**
 * 删除节点: delete deleteall
 * 1. 删除单个节点:delete().forPath("/app1");
 * 2. 删除带有子节点的节点:delete().deletingChildrenIfNeeded().forPath("/app1");
 * 3. 必须成功的删除:为了防止网络抖动。本质就是重试。  client.delete().guaranteed().forPath("/app2");
 * 4. 回调:inBackground
 * @throws Exception
 */


@Test
public void testDelete() throws Exception {
    // 1. 删除单个节点
    client.delete().forPath("/app1");
}

@Test
public void testDelete2() throws Exception {
    //2. 删除带有子节点的节点
    client.delete().deletingChildrenIfNeeded().forPath("/app4");
}
@Test
public void testDelete3() throws Exception {
    //3. 必须成功的删除
    client.delete().guaranteed().forPath("/app2");
}

@Test
public void testDelete4() throws Exception {
    //4. 回调
    client.delete().guaranteed().inBackground(new BackgroundCallback(){

        @Override
        public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
            System.out.println("我被删除了~");
            System.out.println(event);
        }
    }).forPath("/app1");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值