Zookeeper Java API的Curator来操作节点

Java 专栏收录该内容
27 篇文章 0 订阅

 

目录

1、将服务器的防火墙关闭

 2、启动zookeeper服务器以及客户端

 3、通过idea创建maven工程

 4、pom.xml配置如下

 5、配置文件

6、节点增删改查

        6.1、连接zookeeper服务

 6.2  释放资源

 6.3 创建节点

6.4 查询节点

6.5 修改节点

6.6 删除节点


1、将服务器的防火墙关闭

使用SecureCRT工具连接服务器,然后关闭防火墙:

systemctl stop firewalld

 2、启动zookeeper服务器以及客户端

--进入到zookeeper安装目录下的bin目录,启动zookeeper服务

./zkServer.sh start

--重新克隆一份会话,然后同样进入zookeeper安装目录下的bin目录,启动客户端

./zkCli.sh     (在本机安装的客户端可以直接使用该操作)

./zkCli.sh -server ip地址:2181(如果客户端不和服务在同一机器上,需要加上服务的ip地址)

 3、通过idea创建maven工程

结构如下所示:

 4、pom.xml配置如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.flyrain.zk</groupId>
    <artifactId>curator-zk</artifactId>
    <version>1.0-SNAPSHOT</version>
    <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>
    
</project>

 5、配置文件

配置文件下只有日志文件,内容比较简单,如下所示

log4j.rootLogger=off,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%d{yyyy-MM-dd HH/:mm/:ss}]%-5p %c(line/:%L) %x-%m%n

6、节点增删改查

        6.1、连接zookeeper服务

public class CuratorTest {
    private CuratorFramework client;
    @Test
    public void testConZookeeper(){
        //第一种连接策略CuratorFrameworkFactory.newClient()
        /**
         * Create a new client
         *
         * @param connectString       连接字符串  zk server的ip地址和端口,如果集群用逗号隔开 "192.168.117.128:2181"
         * @param sessionTimeoutMs    会话超时时间 单位毫秒
         * @param connectionTimeoutMs 连接超时时间  单位毫秒
         * @param retryPolicy         重试策略
         * @return client
         */
        //重试策略
        RetryPolicy retry = new ExponentialBackoffRetry(3000, 3);
        /*client = CuratorFrameworkFactory.newClient("192.168.117.128:2181", 60 * 1000, 15 * 1000, retry);
        //启动服务
        client.start();*/

        //第二种使用CuratorFrameworkFactory.builder()链式编程方式
        //namespace()设置名称空间根目录,以后不用每次都写前面
        client = CuratorFrameworkFactory.builder()
                .connectString("192.168.117.128:2181")
                .sessionTimeoutMs(90 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retry)
                .namespace("flyrain")
                .build();
        //开启连接
        client.start();
    }
}

 6.2  释放资源

如果不报错,则说明连接成功,然后需要对节点进行操作,我们需在执行其他方法时都要先执行上述连接服务操作,将@Test修改为@Before即可,然后连接服务后,我们也需要释放资源,其代码如下:

//释放资源
    @After
    public void closeCurator(){
        if(client != null){
            client.close();
        }
    }

 6.3 创建节点

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

    }

    //2.创建带数据的节点
    @Test
    public void testNodeWithData(){
        try {
            String path = client.create().forPath("/app2", "nihao".getBytes());
            System.out.println("path : "+path); ///app2
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * PERSITENT 持久化节点
     * EPHEMERAL 临时节点:-e
     * PERSISTENT_SEQUENTIAL :持久化顺序节点: -s
     * EPHEMERAL_SEQUENTIAL: 临时顺序节点:-es
     */
    //3.创建节点类型
    @Test
    public void testNodeType(){
        try {
            String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
            System.out.println("path : "+path); ///app3
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

6.4 查询节点

/**
     * 查询节点
     * 1.查询数据 :get :  getData().forPath()
     * 2.查询子节点:ls   : getChildren().forPath()
     * 3.查询节点状态信息 : ls -s  :getData().storingStatIn(状态对象).forPath()
     */
    @Test
    public void testQueryData(){
        try {
            byte[] data = client.getData().forPath("/app2");
            System.out.println("data : "+new String(data));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询子节点
    @Test
    public void testQueryChildNode(){
        try {
            List<String> list = client.getChildren().forPath("/");
            System.out.println(" list "+list);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //查询子节点状态信息
    @Test
    public void testChildStatus(){
        Stat stat = new Stat();
        System.out.println("stat1 : "+stat);
        try {
            byte[] data = client.getData().storingStatIn(stat).forPath("/app2");
            /**
             * []cZxid = 0x8b
             * ctime = Thu Oct 14 16:57:52 CST 2021
             * mZxid = 0x8b
             * mtime = Thu Oct 14 16:57:52 CST 2021
             * pZxid = 0x8b
             * cversion = 0
             * dataVersion = 0
             * aclVersion = 0
             * ephemeralOwner = 0x0
             * dataLength = 5
             * numChildren = 0
             */
            System.out.println("stat2 : "+stat.getCtime());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

6.5 修改节点

 /**
     * 修改节点
     * 1、基本数据修改: setData().forPath()
     * 2、根据版本修改:setData().withVersion().forPath()
     * version是通过查询出来的,目的是为了不让其他客户端或线程干扰我
     */
    @Test
    public void testUpdataBaseData(){
        try {
             client.setData().forPath("/app2", "wobuhao".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //根据版本修改
    @Test
    public void testUpdataDataByVersion(){
        Stat stat = new Stat();
        //查询节点状态信息:
        try {
            client.getData().storingStatIn(stat).forPath("/app2");
            //查询版本信息
            int version = stat.getVersion();
            client.setData().withVersion(version).forPath("/app2", "随遇而安".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

6.6 删除节点

 /**
     * 删除节点:delete deteleall
     * 1、删除单个节点:delete().forPath("/app2")
     * 2、删除带子节点的节点:delete().deletingChildredIfNeeded().forPath("/app2")
     * 3、必须成功的删除:为了防止网络抖动。本质就是重试
     * client().delete().guaranteed().forPath("/app2")
     * 4、回调:inBackground
     */
    //删除单个节点
    @Test
    public void testDeleteOneNode(){
        try {
            //app3下无子节点
            client.delete().forPath("/app3");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //删除带有子节点的节点
    @Test
    public void testDeleteNodeWithChildNode(){
        try {
            //app4节点下还有p1子节点
            client.delete().deletingChildrenIfNeeded().forPath("/app4");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //必须删除成功
    @Test
    public void testDeleteNeed(){
        try {
            //flyrain根节点下还有flryain子节点
            client.delete().guaranteed().forPath("/flyrain");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //回调
    @Test
    public void testCallBack(){
        try {
            client.delete().guaranteed().inBackground(new BackgroundCallback() {
                @Override
                public void processResult(CuratorFramework client, CuratorEvent event) throws Exception {
                    System.out.println("我被删除了...");
                    System.out.println(event);
                }
            }).forPath("/app2");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

以上就是节点的增删改查操作,我的zookeeper版本是3.5.6版本。

路漫漫其修远兮,吾将上下而求索,希望此篇文章对大家有所帮助......

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 护眼 设计师:闪电赇 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值