ZooKeeper(四)-- 第三方客户端 ZkClient的使用

前言

  zkClient主要做了两件事情:

    一件是在session loss和session expire时自动创建新的ZooKeeper实例进行重连。

    另一件是将一次性watcher包装为持久watcher。后者的具体做法是简单的在watcher回调中,重新读取数据的同时再注册相同的watcher实例。

zkClient目前已经运用到了很多项目中,知名的有Dubbo、Kafka、Helix。

  zkClient jar包下载,或者直接添加maven依赖: http://mvnrepository.com/artifact/com.101tec/zkclient

maven依赖:

<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>

正文

1.测试类  

package com.xbq.demo;
import java.io.IOException;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.IZkDataListener;

/**
 * @ClassName: ZkClientDemo
 * @Description: TODO(zkClient 测试)
 * @author xbq
 * @date 2017-3-26 上午11:49:39
 */
public class ZkClientDemo {

    // 此demo使用的集群,所以有多个ip和端口
    private static String CONNECT_SERVER = "192.168.99.138:2181,192.168.99.138:2182,192.168.99.138:2183";
    private static int SESSION_TIMEOUT = 3000;
    private static int CONNECTION_TIMEOUT = 3000;
    private static ZkClient zkClient ;

    static {
        zkClient = new ZkClient(CONNECT_SERVER, SESSION_TIMEOUT,CONNECTION_TIMEOUT,new MyZkSerializer());
    }

    public static void main(String[] args) {

        add(zkClient);
//        update(zkClient);
//        delete(zkClient);

//        addDiGui(zkClient);
//        deleteDiGui(zkClient);

//        subscribe(zkClient);
    }

    /**
     * @Title: add
     * @Description: TODO(增加一个指定节点)
     * @param @param zkClient    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void add(ZkClient zkClient){
        // 如果不存在节点,就新建一个节点
        if(!zkClient.exists("/config")){
            zkClient.createPersistent("/config","javaCoder");
        }
        // 查询一下,看是否增加成功
        String value = zkClient.readData("/config");
        System.out.println("value===" + value);
    }

    /**
     * @Title: addSequential
     * @Description: TODO(递归创建节点)
     * @param @param zkClient    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void addDiGui(ZkClient zkClient){
        // 递归创建节点
        zkClient.createPersistent("/xbq/java/coder", true);
        if(zkClient.exists("/xbq/java/coder")){
            System.out.println("增加成功!");
        }else {
            System.out.println("增加失败!");
        }
    }

    /**
     * @Title: delete
     * @Description: TODO(删除指定节点)
     * @param @param zkClient    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void delete(ZkClient zkClient){
        // 存在节点才进行删除
        if(zkClient.exists("/config")){
            boolean flag = zkClient.delete("/config");
            System.out.println("删除" + (flag == true ? "成功!" : "失败!"));
        }
    }

    /**
     * @Title: deleteDiGui
     * @Description: TODO(递归删除)
     * @param @param zkClient    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void deleteDiGui(ZkClient zkClient){
        // 存在节点才进行删除
        if(zkClient.exists("/xbq")){
            // 递归删除的时候 只传入 父节点就可以,如果传入 全部的节点,虽然返回的是true,但是依然是没有删除的,
            // 因为zkClient将异常封装好了,进入catch的时候,会返回true,这是一个坑
            boolean flag = zkClient.deleteRecursive("/xbq");
            System.out.println("删除" + (flag == true ? "成功!" : "失败!"));
        }
    }

    /**
     * @Title: update
     * @Description: TODO(修改节点的值)
     * @param @param zkClient    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void update(ZkClient zkClient){
        if(zkClient.exists("/config")){
            zkClient.writeData("/config", "testUpdate");
            // 查询一下,看是否修改成功
            String value = zkClient.readData("/config");
            System.out.println("value===" + value);
        }
    }

    /**
      * @Title: subscribe
     * @Description: TODO(事件订阅, 可用于配置管理)
     * 先订阅,再 操作增删改。(可多个 客户端订阅)
     * @param @param zkClient    设定文件
     * @return void    返回类型
     * @throws
     */
    public static void subscribe(ZkClient zkClient){
        zkClient.subscribeDataChanges("/config/userName", new IZkDataListener() {
            @Override
            public void handleDataDeleted(String arg0) throws Exception {
                System.out.println("触发了删除事件:" + arg0);
            }

            @Override
            public void handleDataChange(String arg0, Object arg1) throws Exception {
                System.out.println("触发了改变事件:" + arg0 + "-->" + arg1);
            }
        });

        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.自定义序列化类

package com.xbq.demo;

import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.serialize.ZkSerializer;

import java.io.UnsupportedEncodingException;

/**
 * @ClassName: MyZkSerializer
 * @Description: TODO(实现序列化接口,转为UTF-8编码)
 * @author xbq
 * @date 2017-3-26 上午11:56:22
 */
public class MyZkSerializer implements ZkSerializer{
    @Override
    public byte[] serialize(Object data) throws ZkMarshallingError {
        try {
            return String.valueOf(data).getBytes("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
        try {
            return new String(bytes, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }
}

原文地址:https://www.cnblogs.com/x-ll123/p/9742111.html

时间: 2024-10-13 16:03:58

ZooKeeper(四)-- 第三方客户端 ZkClient的使用的相关文章

ZooKeeper:第三方客户端 ZKClient

ZKClient ZKClient的设计 ZKClient组件说明 重要的处理流程说明 启动ZKClient 为节点注册Watcher ZooKeeper的变更操作 客户端处理变更 序列化处理 ZKClient如何解决使用ZooKeeper客户端时遇到的问题? ZkClient 在使用ZooKeeper的Java客户端时,经常需要处理几个问题:重复注册watcher.session失效重连.异常处理. 要解决上述的几个问题,可以自己解决,也可以采用第三方的java客户端来完成.这里就介绍一种常用

Zookeeper之开源客户端ZkClient

ZkClient是由Datameer的工程师开发的开源客户端,对Zookeeper的原生API进行了包装,实现了超时重连.Watcher反复注册等功能. ZKClient版本及源码 maven依赖 ZkClient目前有两个不同artifactId的系列. 其中最早的0.1版本maven依赖如下: <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</ar

[转载] ZooKeeper的Java客户端API

转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExample.html http://topmanopensource.iteye.com/blog/1880601 http://san-yun.iteye.com/blog/1977454 客户端要连接 Zookeeper 服务器可以通过创建 org.apache.zookeeper. ZooKeeper

六:ZooKeeper的java客户端api的使用

一:客户端链接测试 1 package com.yeepay.sxf.createConnection; 2 3 import java.io.IOException; 4 5 import org.apache.zookeeper.ZooKeeper; 6 import org.apache.zookeeper.ZooKeeper.States; 7 8 /** 9 * 测试Zookeeper的链接 10 * @author sxf 11 * 12 */ 13 public class Tes

博客园第三方客户端-i博客园正式发布App Store

博客园第三方客户端-i博客园正式发布App Store 1. 前言 算来从15年8月到现在自学iOS已经快7个月了,虽然中间也是断断续续的,不过竟然坚持下来了.年后要找实习啦,于是萌生了一个想法 —— 写一个app练练手.这次我没弄后台了,直接使用了博客园的open api(嘿嘿).之前也做过一个app,叫做魔界-魔术,前后端都是我弄的,不过后端使用的是Bmob后端云(一个Baas服务),但是作为第一个app,代码上感觉很混乱,而且基本上都是用的第三方控件.这次的i博客园是我完全独立开发的(包括

02.ZooKeeper的Java客户端使用

1.ZooKeeper常用客户端比较 1.ZooKeeper常用客户端 zookeeper的常用客户端有3种,分别是:zookeeper原生的.Apache Curator.开源的zkclient,下面分别对介绍它们: zookeeper自带的客户端是官方提供的,比较底层.使用起来写代码麻烦.不够直接. Apache Curator是Apache的开源项目,封装了zookeeper自带的客户端,使用相对简便,易于使用. zkclient是另一个开源的ZooKeeper客户端,其地址:https:

Windows server 2012 搭建VPN图文教程(四)客户端访问VPN测试

Windows server 2012 搭建VPN图文教程(一)安装VPN相关服务 Windows server 2012 搭建VPN图文教程(二)配置路由和远程访问服务 Windows server 2012 搭建VPN图文教程(三)配置VPN访问账户 Windows server 2012 搭建VPN图文教程(四)客户端访问VPN测试 Part IV 客户端访问VPN测试 本部分主要介绍如何通过客户端访问VPN的方法.实验客户端操作系统为windows 8,以下是客户端配置VPN的步骤: 打

【原】博客园第三方客户端-i博客园App开源

[原]博客园第三方客户端-i博客园App开源 本文转载请注明出处 —— polobymulberry-博客园 1.前言 目前i博客园App已经更新到2.0.0版本了,使用了最新的博客园Web API.相比于第一个版本,添加了很多新的功能,也修改了很多功能.整体来说改动比较大,代码也比较混乱.所以趁着清明假期,把代码好好整理了一番.目前基本的架构已成型(当然,后期还需要不断优化),但App基本功能方面还有很多需要添加的,后面会集中把App功能完善. 上面简单介绍了下目前App的情况,回到开源的话题

ICE学习第四步-----客户端请求服务器返回数据

这次我们来做一个例子,流程很简单:客户端向服务器发送一条指令,服务端接收到这条指令之后,向客户端发送数据库中查询到的数据,最终显示在DataGridView上. 根据上一篇文章介绍的Slice语法,我们先来定义ICE文件.我定义两个ICE文件,一个用来描述测试数据库表中属性相关信息,另一个则是请求数据的方法. 结构如下:    定义结构体,和数据库中表的列对应,添加序列(相当于数组类型). 在获取表的方法中注意要记得#include带有结构的ice文件,并把接口函数的返回值类型写成之前定义的数组