文档章节

客户端操作zookeeper服务代码示例

secondriver
 secondriver
发布于 2015/09/17 09:26
字数 851
阅读 82
收藏 0

  本文主要贴出通过zookeeper的客户端类访问zookeeper的示例,以及其它第三方更高层次的封装的客户端使用。


 1.通过org.apache.zookeeper.ZooKeeper来操作zookeeper服务

  有关zookeeper服务的部署参见文:http://aiilive.blog.51cto.com/1925756/1684145 下文将有代码示例展示通过编码方式在应用中启动zookeeper服务。

 

  ZooKeeper类对zookeeper服务的简单操作示例代码如下:

 

package secondriver.dubbo.client;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Author : secondriver
 */
public class TestZookeeper {

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {

        //创建zookeeper客户端
        ZooKeeper zooKeeper = new ZooKeeper("192.168.88.153:2181", 1000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("EventType:" + event.getType().name());
            }
        });

        //获取"/" node下的所有子node
        List<String> znodes = zooKeeper.getChildren("/", true);
        for (String path : znodes) {
            System.out.println(path);
        }

        //创建开放权限的持久化node "/test"
        String rs = zooKeeper.create("/test", "test".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode
                .PERSISTENT);
        System.out.println(rs);

        //同步获取"/test" node的数据
        Stat stat = new Stat();
        byte[] data = zooKeeper.getData("/test", true, stat);
        System.out.println("value=" + new String(data));
        System.out.println(stat.toString());


        //异步获取"/test" node的数据
        zooKeeper.getData("/test", true, new AsyncCallback.DataCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
                System.out.println(rc);
                System.out.println(path);
                System.out.println(ctx);
                System.out.printf(new String(data));
                System.out.println(stat.toString());

            }
        }, "Object ctx ..(提供的外部对象)");

        TimeUnit.SECONDS.sleep(10);

        zooKeeper.close();
    }
}


  上述代码依赖zookeeper包

 

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.6</version>
</dependency>


 2.通过zkclient操作zookeeper服务

  zkclient github: https://github.com/sgroschupf/zkclient 

  后续有二次开发的版本:

  项目: https://github.com/adyliu/zkclient

  文档: https://github.com/adyliu/zkclient/wiki/tutorial

 

  下文代码示例使用sgroschupf/zkclient,依赖Zookeeper包。

  maven  sgroschupf/zkclient

 

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.5</version>
</dependency>

 

  应用内server+client:

 

package secondriver.dubbo.server;

import org.I0Itec.zkclient.IDefaultNameSpace;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkServer;
import org.apache.zookeeper.CreateMode;

import java.io.IOException;
/**
 * Author : secondriver
 */
public class TestI0ItecZk {

    public static void main(String[] args) throws IOException {
        //Server + Client
        ZkServer zkServer = new ZkServer("D:/data", "D:/log", new IDefaultNameSpace() {
            @Override
            public void createDefaultNameSpace(ZkClient zkClient) {
                zkClient.create("/default", "defalut-name-space", CreateMode.PERSISTENT);
            }
        });

        zkServer.start();

        ZkClient zkClient = zkServer.getZkClient();

        boolean exists = zkClient.exists("/default");
        if (exists) {
            System.out.println("default name space init create succeed.");
        } else {
            System.out.println("default name space init create failed.");
        }

        System.in.read();

        zkClient.close();
        zkServer.shutdown();
    }
}

 

  应用外部署server,使用client访问:

 

package secondriver.dubbo.server;

import org.I0Itec.zkclient.ZkClient;

import java.util.List;

/**
 * Author : secondriver
 */
public class TestZkClient {

    public static void main(String[] args) {
        //Only use client
        ZkClient zkc = new ZkClient("192.168.88.153:2181,192.168.88.153:2182,192.168.88.153:2183");
        List<String> childrens = zkc.getChildren("/");
        for (String child : childrens) {
            System.out.println(child);
        }
    }
}

  

  下文代码示例使用adyliu/zkclient,同样依赖Zookeeper包,启动Zookeeper服务并做操作。

  maven adyliu/zkclient:

 

<dependency>
    <groupId>com.github.adyliu</groupId>
    <artifactId>zkclient</artifactId>
    <version>2.1.1</version>
</dependency>

  

package secondriver.dubbo.server;

import com.github.zkclient.*;

import java.io.IOException;
import java.util.List;

/**
 * Author : secondriver
 */
public class TestZk {


    public static void main(String[] args) throws IOException {

        String home = System.getProperty("user.home");

        //创建zookeeper服务并启动
        ZkServer zkServer = new ZkServer(home + "/zookeeper/data", home + "/zookeeper/log", 2181);
        zkServer.start();

        //方式一
//        ZkClient zkClient = new ZkClient("127.0.0.1:2181", 1000);
        //方式二
        ZkClient zkClient = zkServer.getZkClient();

        String path = "/test" + Math.random();

        //数据监听
        final IZkDataListener dataListener = new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, byte[] data) throws Exception {
                System.out.println(dataPath + " data change");
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {

            }
        };

        //结点(node)监听
        final IZkChildListener childListener = new IZkChildListener() {
            @Override
            public void handleChildChange(String parentPath, List<String> currentChildren) throws Exception {
                System.out.println(parentPath + " parentPath");
                for (String path : currentChildren) {
                    System.out.println(path);
                }
            }
        };

        //为指定node添加监听
        zkClient.subscribeDataChanges(path, dataListener);
        zkClient.subscribeChildChanges("/", childListener);

        //zkclient操作Zookeeper服务
        ///检测node是否存在
        if (zkClient.exists("/zookeeper")) {
            System.out.println("Exist zookeeper path");
        } else {
            System.out.println("Not Exist zookeeper path");
        }

        zkClient.createPersistent(path, path.getBytes());
        byte[] before = zkClient.readData(path);
        System.out.println("before:" + new String(before));

        //以原子的方式更新指定的path node的数据
        zkClient.cas(path, new IZkClient.DataUpdater() {

            @Override
            public byte[] update(byte[] currentData) {
                return new String(currentData).concat(new String(" updated")).getBytes();
            }
        });

        byte[] after = zkClient.readData(path);
        System.out.println("after:" + new String(after));

        //取消指定path node的数据监听
        zkClient.unsubscribeDataChanges(path, dataListener);

        zkClient.writeData(path, "new-data".getBytes());

        byte[] dataBytes = zkClient.readData(path);
        String data = new String(dataBytes);
        System.out.println(path + " data :" + data);

        System.in.read();

        zkClient.close();
        zkServer.shutdown();
    }
}


 3. Zookeeper客户端和富Zookeeper框架之curator

  github: https://github.com/Netflix/curator

  已成为apache项目:http://curator.apache.org

本文出自 “野马红尘” 博客,请务必保留此出处http://aiilive.blog.51cto.com/1925756/1684451

© 著作权归作者所有

secondriver
粉丝 10
博文 229
码字总数 233821
作品 0
广州
程序员
私信 提问
ZooKeeper教程资源收集(简介/原理/示例/解决方案)

菩提树下的杨过: ZooKeeper 笔记(1) 安装部署及hello world ZooKeeper 笔记(2) 监听数据变化 ZooKeeper 笔记(3) 实战应用之【统一配置管理】 ZooKeeper 笔记(4) 实战应用之【消除单点故障】...

easonjim
2017/09/05
0
0
ZooKeeper学习第三期---Zookeeper命令操作

一、Zookeeper的四字命令 Zookeeper支持某些特定的四字命令字母与其的交互。他们大多数是查询命令,用来获取Zookeeper服务的当前状态及相关信息。用户在客户端可以通过telnet或nc向Zookeeper...

卯金刀GG
2017/10/25
44
0
Zookeeper系列(一):它是干什么的

Zookeeper是一款开源的分布式存储系统。 ZooKeeper主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。 Zookee...

守望者之父
09/06
24
0
ZooKeeper源码解析(一)-入门操作

Zookeeper 分布式服务框架是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。...

守望者之父
2017/06/18
12
0
基于.NET CORE微服务框架 -Api网关服务管理

1、前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装 2. 增加服务元...

fanly11
2017/08/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue入门--简单路由配置

本文转载于:专业的前端网站➜vue入门--简单路由配置   在初始化vue init webpack <工程名>时,有一步是询问是否安装vue-router,选择yes,如果没有安装的话,后面需要自己安装。然后在目录...

前端老手
33分钟前
3
0
怎么给视频配音

很多刚开始尝试视频制作的小伙伴,帮助到怎么给制作完成的视频配音,其实给视频配音的方法非常简单,在手机上可以进行制作,下面一起来看看给视频配音的方法吧! 具体步骤如下: 1、首先在手...

白米稀饭2019
42分钟前
3
0
windows批处理bat脚本编写

什么是bat脚本 .bat结尾的文件其实就是windows上的批处理脚本,Windows中的bat文件相当于 Linux中shell编程的.sh脚本,批量执行DOS命令。 其最简单的例子,是逐行书写在命令行中会用到的各种...

孙幼凌
50分钟前
3
0
华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
58分钟前
5
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部