通过Curator操作ZooKeeper

Curator

Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。

Curator 最初是 Netfix 研发的,后来捐献了 Apache 基金会,目前是 Apache 的顶级项目。

Curator建立与客户端的连接与关闭连接

  1. 方式一

    /**
     * 创建连接
     */
    @Before
    public void connectionTest() {
    
    /*
    		定义重试策略
    		参数1:表示如果客户端没有连接成功,那么3000毫秒就尝试连接1次
    		参数2:最多连接10次就不再连接
    	*/
    
    ExponentialBackoffRetry retry = new ExponentialBackoffRetry(3000, 10);
    
    /*
    		创建连接
    		connectString():设置连接的zookeeper服务器的ip:端口号
    		connectionTimeoutMs():设置最大连接超时时间
    		sessionTimeoutMs():设置会话时间,如果在设定的时间内客户端与服务器端没有进行交流,那么断开连接。
    		retryPolicy():定义重试的策略
    
    	*/
    CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.242.130:2181")
    	.connectionTimeoutMs(15 * 1000)
    	.sessionTimeoutMs(1000 * 60)
    	.retryPolicy(retry).build();
    
    //开启连接
    client.start();
    }
    
  2. 方式二

    /**
     * 创建连接
     */
    @Before
    public void getConnection() {
    
    	/*
    		String connectString:连接zookeeper服务器的参数字符串 ip:port
    		int sessionTimeoutMs:会话超时时间,在设置的时间内,客户端和服务器不交流,就断开连接
    		int connectionTimeoutMs:连接超时时间
    		RetryPolicy retryPolicy:重试策略;当客户端连接不上服务器的时候,使用什么样的重试策略。
    									策略如:1.一直继续连接,直到连接上位置
    										   2.在尝试连接几次,连接不上就放弃连接。
    										   ....
    
    	   RetryUntilElapsed: 是retryPolicy的实现类,表示一直重试,直到重试的时间超过最大时间后,就不再重试
    	   maxElapsedTimeMs 最大重试时间
    	   sleepMsBetweenRetries 每次重试的间隔时间
    	*/
    	client = CuratorFrameworkFactory.newClient("192.168.242.130:2181",
    			1000 * 60,
    			1000 * 10,
    			new RetryUntilElapsed(10 * 1000, 1000));
    
    	//开启连接
    	client.start();
    }
    
  3. 关闭连接

    /**
         * 关闭连接
         */
    u
    public void close() {
        //关闭客户端与服务器的连接
        client.close();
    }
    

Curator创建节点

​ 注意以下的client是创建的客户端连接对象

  • 创建普通节点

    /**
     * 创建普通节点
     */
    @Test
    public void createTest() throws Exception {
        String path = client.create().forPath("/app1");
        System.out.println(path);
    }
    
  • 创建普通节点,并设置节点数据

    /**
     * 创建一个节点并设置数据
     *
     * @throws Exception
     */
    @Test
    public void createTest01() throws Exception {
        String path = client.create().forPath("/app2", "肖肖".getBytes());
        System.out.println(path);
    }
    
  • 创建临时节点,并设置节点数据

    /**
     * 创建一个临时节点并设置数据
     *
     * @throws Exception
     */
    @Test
    public void createTest02() throws Exception {
        String path = client.create().withMode(CreateMode.EPHEMERAL).forPath("/app3");
        System.out.println(path);
    }
    
  • 创建一个顺序持久节点

    /**
         * 创建一个顺序持久节点
         *
         * @throws Exception
         */
    @Test
    public void createTest03() throws Exception {
        String path = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/app4");
        System.out.println(path);
    }
    

Curator查询节点

  • 查询节点的数据

    /**
         * 查询节点的数据
         */
    @Test
    public void getTest() throws Exception {
        byte[] bytes = client.getData().forPath("/app2");
        System.out.println(new String(bytes));
    }
    
  • 查询指定节点的子节点有哪些

    /**
     * 查询指定节点的子节点有哪些
     */
    @Test
    public void getChildNode() throws Exception {
        List<String> strings = client.getChildren().forPath("/");
        strings.forEach(node -> System.out.println(node));
    }
    
    
  • 查询指定节点的状态信息

    /**
         * 查询当前节点的状态信息
         */
    @Test
    public void getInfoTest() throws Exception {
        //创建节点的状态信息对象
        Stat stat = new Stat();
        //查询指定节点的状态信息,存入stat对象中
        client.getData().storingStatIn(stat).forPath("/app2");
        System.out.println(stat);
    }
    
    

Curator修改节点

  • 修改节点的数据

    /**
         * 修改节点的数据
         */
    @Test
    public void setTest() throws Exception {
        //要求要修改节点的节点必须存在
        Stat path = client.setData().forPath("/app40000000015", "张三".getBytes());
        System.out.println(path);
    }
    
    
  • 根据版本号,修改节点的数据

    /**
         * 根据版本号修改节点的数据
         */
    @Test
    public void setVersion() throws Exception {
    
        //创建节点的状态信息独享
        Stat status = new Stat();
    
        //获取节点的状态信息,获取到的状态信息会存入status对象中
        client.getData().storingStatIn(status).forPath("/app2");
        //从节点状态信息对象中获取节点的版本号
        int version = status.getVersion();
        System.out.println(version);
    
        /*
                根据版本修改节点的数据
                当withVersion()中的版本数据与从对象信息中获取的版本相同的时候,才会执行修改,否则报错。
                这样就可以保证修改数据的时候的原子性,必须保持版本一致,才会进行节点的数据修改。
            */
        client.setData().withVersion(version).forPath("/app2", "橘右京".getBytes());
    }
    
    

Curator删除节点

  • 删除节点

    /**
         * 删除节点
         */
    @Test
    public void deleteTest() throws Exception {
        client.delete().forPath("/app1");
    }
    
    
  • 删除指定节点及其子节点

    /**
         * 删除指定节点及其子节点
         */
    @Test
    public void deleteNodeAndChildNodeTest() throws Exception {
        client.delete().deletingChildrenIfNeeded().forPath("/app1");
    }
    
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值