Zookeeper实战之配置服务步骤详解

Server 用来启动一个Zookeeper服务

package my.zookeeperstudy.config;

import org.apache.zookeeper.server.ServerCnxnFactory;
import org.apache.zookeeper.server.ZooKeeperServer;

import java.io.File;
import java.net.InetSocketAddress;

public class Server {

    public static void main(String[] args) throws Exception {
        int tickTime = 2000;
        int maxClientCnxns = 60;
        File dir = new File(System.getProperty("java.io.tmpdir"), "zookeeper").getAbsoluteFile();
        ZooKeeperServer zkServer = new ZooKeeperServer(dir, dir, tickTime);
        ServerCnxnFactory standaloneServerFactory = ServerCnxnFactory.createFactory(new InetSocketAddress(2181), maxClientCnxns);
        standaloneServerFactory.startup(zkServer);
    }

}
Config 配置类,包含要操作的配置项和方法等。

package my.zookeeperstudy.config;

import org.apache.zookeeper.*;

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

public class Config implements Watcher {

    private ZooKeeper zk;

    private String basePath = "/config";

    public Config() {

    }

    public void connect(String hosts) throws IOException, KeeperException, InterruptedException {
        this.zk = new ZooKeeper(hosts, 1000, this);
        if (zk.exists(basePath, this) == null) {
            zk.create(basePath, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
    }

    public void set(String key, String value) throws InterruptedException, KeeperException {
        String path = basePath + "/" + key;
        if (zk.exists(path, this) == null) {
            zk.create(path, value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        } else {
            zk.setData(path, value.getBytes(), -1);
        }
    }

    public String get(String key) throws InterruptedException, KeeperException {
        String path = basePath + "/" + key;
        if (zk.exists(path, this) != null) {
            byte[] data = zk.getData(path, this, null);
            return new String(data);
        }
        return null;
    }

    public void printConfig() throws InterruptedException, KeeperException {
        System.out.println("----- begin -----");
        List<String> children = zk.getChildren(basePath, false);
        Collections.sort(children);
        for (String child : children) {
            System.out.println(child + ": " + get(child));
        }
        System.out.println("----- end -----");
    }

    public void clear() throws KeeperException, InterruptedException {
        if (zk.exists(basePath, false) != null) {
            List<String> children = zk.getChildren(basePath, false);
            for (String child : children) {
                zk.delete(basePath + "/" + child, -1);
                System.out.println("Deleted " + basePath + "/" + child);
            }
            zk.delete(basePath, -1);
        }
    }

    @Override
    public void process(WatchedEvent event) {
        System.out.println("event: " + event);
        if (event.getType() == Event.EventType.NodeDataChanged ||
                event.getType() == Event.EventType.NodeChildrenChanged) {
            try {
                printConfig();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (KeeperException e) {
                e.printStackTrace();
            }
        }
    }
}
ClientA和ClientB – 两个客户端,模拟配置修改和同步

ClientA.Java

package my.zookeeperstudy.config;

public class ClientA {
    public static void main(String[] args) throws Exception {
        Config config = new Config();
        config.connect("localhost:2181");

        while (true) {
            Thread.sleep(1000);
            config.get("mykey");
        }
    }
}
ClientB.java

package my.zookeeperstudy.config;

public class ClientB {
    public static void main(String[] args) throws Exception {
        Config config = new Config();
        config.connect("localhost:2181");

        for (int i = 0; i < 10000; i++) {
            config.set("mykey", "myvalue_" + i);
            Thread.sleep(5 * 1000);
        }

        config.clear();
    }
}
测试

首先启动Server类,然后启动ClientA和ClientB,然后观察ClientA和ClientB的输出。

时间: 2024-09-25 12:55:39

Zookeeper实战之配置服务步骤详解的相关文章

Centos系统下配置DHCP服务步骤详解

基础环境: [root@PXE ~]# uname -a Linux PXE 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux [root@PXE ~]# ifconfig eth0      Link encap:Ethernet  HWaddr 00:0C:29:70:00:DA            inet addr:1.1.1.13  Bcast:1.1.1.

CentOS7安装配置Oracle11g 步骤详解

1. 操作系统环境.安装包准备 宿主机:Max OSX 10.10.5 虚拟机:Parallel Desktop 10.1.1 虚拟机操作系统:CentOS-7-x86_64-DVD-1511.iso Oracle:linux.x64_11gR2_database_1of2.zip linux.x64_11gR2_database_2of2.zip JDK:jdk1.8.0_77.zip 2. 安装CentOS7虚拟机 2.1 新建虚拟机 CPU:2核 内存:4G 硬盘:60G,扩展磁盘 2.2

ubuntu 14.04安装配置denyhosts步骤详解

目前官网最新版本是2.10,记得以前的ubuntu版本(<=12.04LTS)中好像直接apt-get install denyhosts 就可以了,在最新的发行版不知为何不见了. 安装 你可以前往官网http://sourceforge.net/projects/denyhost/ 选择一个你喜欢的版本下载,或者直接运行下面的命令下载. cd /tmp/ && wget http://jaist.dl.sourceforge.net/project/denyhost/denyhos

Centos下安装Mrtg配置的步骤详解

以下是笔记: 1.检查系统是否安装了mrtg软件 # rpm -qa | grep mrtg* 安装mrtg软件 # yum -y install mrtg* 2.mrtg配置文件(以下是mrtg配置文件内容是详细说明) 提供我们鹏飞微服务的配置文件给大家下载参考:http://url.cn/PT118T [文件名自己设置] # vi /etc/mrtg/mrtg.cfg 以下是配置内容解释: HtmlDir:/var/www/mrtg   //html存放目录 ImageDir:/var/ww

centos 6系统安装配置pptpd步骤详解

配置环境: 服务器版本:centos 6.4 x86 pptpd版本:pptpd v1.40 一.vpn介绍 vpn全名叫虚拟专用网络,技术简单来就是在公网中架设私网,在公司内网中架设VPN服务器,在外网通过访问VPN服务器作为跳板来访问公司内网的资源,同理,通过vpn翻墙也是这个原理,具体详细的请看百度百科:vpn技术,对于本人来说,最直接的应用就是翻墙,如果需要可以邮件我或者QQ找我提供的 二.vpn_pptp搭建 1.准备工作 1)查看系统是否已经编译了mppe modprobe ppp-

LAMT基于mod_jk配置使用步骤详解

mod_jk 配置apache通过mod_jk模块与Tomcat连接 mod_jk是ASF的一个项目,是一个工作于apache端基于AJP协议与Tomcat通信的连接器,它是apache的一个模块,是AJP协议的客户端(服务端是Tomcat的AJP连接器). [root@nginx-proxy2 conf.d]# cd [root@nginx-proxy2 ~]# tar xf tomcat-connectors-1.2.40-src.tar.gz [root@nginx-proxy2 ~]#

linux中安装配置sphinx2步骤详解

# 安装sphinx 2.x  代码如下 复制代码 cd /home/addcn wget http://sphinxsearch.com/files/sphinx-2.1.1-beta.tar.gz tar xvf sphinx-2.1.1-beta.tar.gz cd sphinx-2.1.1-beta make clean ./configure –prefix=/usr/local/sphinx –with-mysql=/usr/local/mysql make && make i

Redis 安装及主从配置的步骤详解

Redis是一个开源.支持网络.基于内存.键值对存储数据库.与其他非关系型数据库主要不同在于,Redis中值的类型不仅限于字符串(Strings),还支持如下抽象数据类型:(列表)Lists.(集合)Sets.(有序集合)Sorted sets .(哈希)Hashes.Redis 通过 RDB.AOF 两种方式来实现数据的持久化.   安装Redis   Redis 源码包保存路径 /usr/local/src   Redis 软件安装路径 /usr/local/redis   编译 Redis

mysql免安装版配置步骤详解

 这篇文章主要介绍了mysql免安装版配置步骤详解,提供了二个网友的安装方法,大家可以参考使用 1.准备工作   下载mysql的最新免安装版本mysql-noinstall-5.1.53-win32.zip,解压缩到相关目录,如:d: mysql-noinstall-5.1.53-win32.这个就是mysql的根目录了.   2.配置   在根目录下有几个文件如下:   my-small.ini (这是针对一个小内存(〈= 64MB)的系统,MySQL 只会被时不时地用一下,很重要的是 my