Zookeeper--配置服务

配置服务是分布式应用中重要的服务,作用是使集群中的机器可以共享配置信息中公共的部分。ZooKeeper可作为一个具有高可用,全局一致的配置服务器,允许客户端获取和更新配置文件。使用ZooKeeper中的观察机制,可以建立一个活跃的配置服务,客户端监控自己感兴趣的配置节点,在第一时间得到配置信息修改的通知。

下面是一个简单的例子:

配置服务类:

public class ZkConfigService implements Watcher{

    private final Charset CHARSET = Charset.forName("UTF-8");

    private final int SESSION = 5000;

    public final String CONFIG_PATH = "/__config__";

    private ZooKeeper zk;

    private CountDownLatch latch = new CountDownLatch(1);

    private static ZkConfigService ser = new ZkConfigService();

    public static ZkConfigService getInstance(){
return ser;
} private ZkConfigService() {
try {
zk = new ZooKeeper("localhost:2181", SESSION, this);
latch.await();
if (zk.exists(CONFIG_PATH, false) == null) {
zk.create(CONFIG_PATH, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
} private void close() throws InterruptedException {
zk.close();
} public void write(String path, String value) {
path = CONFIG_PATH + "/" + path;
Stat stat = null;
try {
stat = zk.exists(path, false);
if (stat == null) {
zk.create(path, value.getBytes(CHARSET), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} else {
zk.setData(path, value.getBytes(CHARSET), -1);
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public String read(String path, Watcher watcher) {
path = CONFIG_PATH + "/" + path;
byte[] data = new byte[0];
try {
data = zk.getData(path, watcher, null);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return new String(data, CHARSET);
} @Override
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
latch.countDown();
}
}
}

---

配置更新类:

public class ConfigUpdater {

    private String path;
private Random random = new Random(); private ZkConfigService configSer = ZkConfigService.getInstance(); public ConfigUpdater(String path) {
this.path = path;
} public static void main(String[] args) throws KeeperException, InterruptedException, IOException {
ConfigUpdater up = new ConfigUpdater("db.url");
up.run();
} public void run() throws KeeperException, InterruptedException {
int i=0;
while (true) {
String value = i++ + "";
configSer.write(path, value);
System.out.printf("Set %s to %s\n", path, value);
TimeUnit.SECONDS.sleep(random.nextInt(5));
}
}
}

---

配置获取类:

public class ConfigWatcher implements Watcher {

    private String path;

    private ZkConfigService configSer = ZkConfigService.getInstance();

    public ConfigWatcher(String path) {
this.path = path;
} public static void main(String[] args) throws InterruptedException, KeeperException, IOException {
ConfigWatcher w = new ConfigWatcher("db.url");
w.display(); Thread.sleep(Long.MAX_VALUE);
} public void display() throws KeeperException, InterruptedException {
String value = configSer.read(path, this);
System.out.printf("Read %s as %s\n", path, value);
} @Override
public void process(WatchedEvent event) {
if (event.getType() == Event.EventType.NodeDataChanged) {
try {
display();
} catch (InterruptedException e) {
System.err.println(e);
Thread.currentThread().interrupt();
} catch (KeeperException e) {
e.printStackTrace();
}
}
}
}

---每次获取时都设置一个监控

分别启动配置更新和获取类,控制台打印如下:

end

Zookeeper--配置服务的更多相关文章

  1. zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析

    程序的发展,需要引入集中配置: 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境.分集群管理配 ...

  2. Zookeeper 配置集群环境详解

    在Linux环境下安装zookeeper 在Linux环境下安装zookeeper 1.       将zookeeper-3.4.13.tar.gz复制到linux操作系统 2.       通过p ...

  3. Windows里如何正确安装Zookeeper以服务运行(博主推荐)(图文详解)

    不多说,直接上干货! 为什么要在Win下来安装Zookeeper呢? 其实玩过大数据的人很清楚,在Linux下我更不说了.在win下,如Disconf .Dubbo等应用. 所以,它的应用是非常广的. ...

  4. Dubbo学习笔记1:使用Zookeeper搭建服务治理中心

    Zookeeper是Apache Hadoop的子项目,是一个树形的目录服务,支持变更推送,适合作为Dubbo服务的注册中心,工业强度较高,推荐生成环境使用. , 下面结合上图介绍Zookeeper在 ...

  5. zookeeper命名服务

    zookeeper概念 zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,底层组成单元是znode,对于zookeeper来说,所有的功能都是基于znode来实现的,因此有万物皆节点 ...

  6. 【转帖】基于Zookeeper的服务注册与发现

    http://www.techweb.com.cn/network/hardware/2015-12-25/2246973.shtml 背景 大多数系统都是从一个单一系统开始起步的,随着公司业务的快速 ...

  7. 服务端使用Zookeeper注册服务地址,客户端从Zookeeper获取可用的服务地址。

    一个轻量级分布式RPC框架--NettyRpc - 阿凡卢 - 博客园 http://www.cnblogs.com/luxiaoxun/p/5272384.html 这个RPC框架使用的一些技术所解 ...

  8. Zookeeper协调服务系统·ELK日志管理系统简介

    Zookeeper协调服务系统: 说明:它分布式系统中的协调服务系统,是Hadoop下的一个子项目,可提供的服务有:名字服务.配置服务.分布式同步.组服务等. 3个角色:Leaders.Follow. ...

  9. Windows里正确安装Zookeeper以服务运行

    不多说,直接上干货! 为什么要在Win下来安装Zookeeper呢? 其实玩过大数据的人很清楚,在Linux下我更不说了.在win下,如Disconf .Dubbo等应用. 所以,它的应用是非常广的. ...

  10. 基于CentOS6.5的Dubbo及Zookeeper配置

    基于CentOS的Dubbo及Zookeeper配置 需要提前准备好的资料: 1.首先配置java环境 步骤: 将jdk的包上传至centos服务器的/opt目录下,并且解压 tar -zxvf jd ...

随机推荐

  1. ZOJ 2971 Give Me the Number (模拟,字符数组的清空+map)

    Give Me the Number Time Limit: 2 Seconds      Memory Limit: 65536 KB Numbers in English are written ...

  2. Redis数据库的学习及与python的交互

    1. 数据库简介: 当前主要使用两种类型的数据库:关系型数据库(RDBMS).非关系型数据库(NoSQL); (1). 关系型数据库RDBMS: 是建立在关系模型基础上的数据库,借助于集合代数等数学概 ...

  3. Python中列表生成式和字典生成式练习

    (一)列表生成式 练习一:编写名为collatz(number)的函数:实现的功能:参数为偶数时,打印number// 2;参数为奇数时,打印3*number + 1 解析: number = int ...

  4. mysql动态扩容调研

    MySQL动态扩容方案 目前可用方案 MySQL的复制: 一个Master数据库,多个Salve,然后利用MySQL的异步复制能力实现读写分离,这个方案目前应用比较广泛,这种技术对于以读为主的应用很有 ...

  5. online learning,batch learning&批量梯度下降,随机梯度下降

    以上几个概念之前没有完全弄清其含义及区别,容易混淆概念,在本文浅析一下: 一.online learning vs batch learning online learning强调的是学习是实时的,流 ...

  6. UDP:rfc768/广播和多播/IGMP

    封装情况:

  7. 【剑指offer】之字形打印二叉树,C++实现

    原创文章,转载请注明出处! 本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打 ...

  8. MYSQL 调优和使用必读

    转载自:http://blog.eood.cn/mysql#rd?sukey=fc78a68049a14bb29c60f21c5254b15a1a9234459cf25ff467de14129ca11 ...

  9. 全球常用NTP服务器地址及IP列表ntpdate

    pool.ntp.org是一组授时服务器虚拟集群,在全球有3000多台服务器,只需要这样写就行了,具体哪台服务器提供服务无需关心. time.windows.com   微软 asia.pool.nt ...

  10. 21天学通C++_Day6

    0.指针&数组 数组是指向其第一个元素的指针,即数组变量就是指针.故可将(*)用于数组,也可将([])用于指针,eg: int MyNums[5] = {0}; int* pNums = My ...