分布式助手Zookeeper(四)
分布式助手Zookeeper(四)博客分类:
事实上,利用Zookeeper,就能够很容易的,高可靠的帮我们完成这件事,我们只需要把配置文件保存在Zookeeper的znode里,然后通过Watch来监听数据变化,进而帮我们实现同步。一个简单的工作图如下所示:

总结流程如下:
| 序号 | 实现 | 1 | 启动ZK集群 | 2 | 客户端在ZK创建一个znode,并写入数据 | 3 | 启动各个Server上的Watcher,无限休眠 | 4 | 客户端更新znode里数据 | 5 | Watcher的read方法发现数据更新,下拉至本地,更新本地数据 |
代码如下:
package com.sanjiesanxian; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat; /***
* Zookeeper实现分布式配置同步
*
* @author 秦东亮
*
* ***/
public class SyscConfig implements Watcher{ //Zookeeper实例
private ZooKeeper zk;
private CountDownLatch countDown=new CountDownLatch(1);//同步工具
private static final int TIMIOUT=5000;//超时时间
private static final String PATH="/sanxian";
public SyscConfig(String hosts) { try{
zk=new ZooKeeper(hosts, TIMIOUT, new Watcher() { @Override
public void process(WatchedEvent event) { if(event.getState().SyncConnected==Event.KeeperState.SyncConnected){
//防止在未连接Zookeeper服务器前,执行相关的CURD操作
countDown.countDown();//连接初始化,完成,清空计数器
} }
}); }catch(Exception e){
e.printStackTrace();
}
} /***
* 写入或更新
* 数据
* @param path 写入路径
* @param value 写入的值
* **/
public void addOrUpdateData(String path,String data)throws Exception { Stat stat=zk.exists(path, false);
if(stat==null){
//没有就创建,并写入
zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("新建,并写入数据成功.. ");
}else{
//存在,就更新
zk.setData(path, data.getBytes(), -1);
System.out.println("更新成功!");
}
} /**
* 读取数据
* @param path 读取的路径
* @return 读取数据的内容
*
* **/
public String readData()throws Exception{ String s=new String(zk.getData(PATH, this, null)); return s;
} /**
* 关闭zookeeper连接
* 释放资源
*
* **/
public void close(){ try{ zk.close();
}catch(Exception e){
e.printStackTrace();
} } public static void main(String[] args)throws Exception { SyscConfig conf=new SyscConfig("10.2.143.5:2181"); conf.addOrUpdateData(PATH, "修真天劫,九死一生。");
conf.addOrUpdateData(PATH, "圣人之下,皆为蝼蚁,就算再大的蝼蚁,还是蝼蚁.");
conf.addOrUpdateData(PATH, "努力奋斗,实力才是王道! "); //System.out.println("监听器开始监听........");
// conf.readData();
// Thread.sleep(Long.MAX_VALUE);
//conf.readData();
conf.close(); } @Override
public void process(WatchedEvent event){
try{
if(event.getType()==Event.EventType.NodeDataChanged){
System.out.println("变化数据: "+readData());
}
}catch(Exception e){
e.printStackTrace();
} }
}
模拟客户端输出如下:
//客户端监听代码
SyscConfig conf=new SyscConfig("10.2.143.5:2181"); conf.addOrUpdateData(PATH, "修真天劫,九死一生。");
conf.addOrUpdateData(PATH, "圣人之下,皆为蝼蚁,就算再大的蝼蚁,还是蝼蚁.");
conf.addOrUpdateData(PATH, "努力奋斗,实力才是王道! "); //System.out.println("监听器开始监听........");
// conf.readData();
// Thread.sleep(Long.MAX_VALUE);
//conf.readData();
conf.close(); 更新成功!
更新成功!
更新成功!
模拟服务端输出如下:
public static void main(String[] args)throws Exception {
//服务端监听代码
SyscConfig conf=new SyscConfig("10.2.143.36:2181");
//conf.addOrUpdateData(PATH, "");
System.out.println("模拟服务监听器开始监听........");
conf.readData();
Thread.sleep(Long.MAX_VALUE);
conf.close();
}
模拟服务监听器开始监听........
数据更新了: 修真天劫,九死一生。
数据更新了: 圣人之下,皆为蝼蚁,就算再大的蝼蚁,还是蝼蚁.
数据更新了: 努力奋斗,实力才是王道!
至此,使用zookeeper来完成配置同步的服务就完成了,我们可以发现,使用zookeeper来编写分布式程序是非常简单可靠的。
分布式助手Zookeeper(四)的更多相关文章
- 分布式助手Zookeeper(一)
分布式助手Zookeeper(一)博客分类: Zookeeper Zookeeper最早是Hadoop的一个子项目,主要为Hadoop生态系统中一些列组件提供统一的分布式协作服务,在2010年10 ...
- 分布式助手Zookeeper(三)
分布式助手Zookeeper(三)博客分类: Zookeeper zookeeperapi操作zookeeper 本篇,散仙要介绍一下基于zookeeper的一些API的编程. 在此之前,我们先来熟悉 ...
- 分布式助手Zookeeper(二)
分布式助手Zookeeper(二)博客分类: Zookeeper zookeeperzookeeper的安装和配置观察者observer 散仙在上篇文章介绍了,zookeeper的一系列基础知识,如果 ...
- 实现分布式队列ZooKeeper的实现
一.背景 有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己任务再交给C团队继续做.这就有点像业务系统的工作流一样,一环一环地传下去,直 ...
- 分布式队列ZooKeeper的实现
一.背景 有一些时候,多个团队需要共同完成一个任务,比如,A团队将Hadoop集群计算的结果交给B团队继续计算,B完成了自己任务再交给C团队继续做.这就有点像业务系统的工作流一样,一环一环地传下 去, ...
- 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)
版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...
- 一步到位分布式开发Zookeeper实现集群管理
说到分布式开发Zookeeper是必须了解和掌握的,分布式消息服务kafka .hbase 到hadoop等分布式大数据处理都会用到Zookeeper,所以在此将Zookeeper作为基础来讲解. Z ...
- zookeeper 四字命令
zookeeper四字命令 ZooKeeper3.4.6支持某些特定的四字命令字母与其的交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 te ...
- Zookeeper四字命令
ZooKeeper 支持某些特定的四字命令(The Four Letter Words)与其进行交互.它们大多是查询命令,用来获取 ZooKeeper 服务的当前状态及相关信息.用户在客户端可以通过 ...
随机推荐
- MemSQL Start[c]UP 2.0 - Round 2
反正晚上睡不着,熬到1点开始做比赛,6个题目只做了2个题目,而且手速还比较慢,待提升空间还很大呢. A题:给定两个0,1串(len<=100000), 但是不是普通的二进制串,而是q进制串,q ...
- codeforces Mafia
/* * Mafia.cpp * * Created on: 2013-10-12 * Author: wangzhu */ /** * 每个人都想玩若干场,求至少需要玩几场才可以满足大家的需求. * ...
- ASP.NET 弹出对话框和页面之间传递值的经验总结
今天碰到一个弹出对话框(PopUp dialog)的问题, 因该是个傻瓜问题, 但是还是让我研究了半天, 总结了一些前人经验, 拿出来跟大家分享一下! 在ASP.Net中页面之间的传值方法有很多,但是 ...
- SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-003-Pizza例子的基本流程
一. 1. 2.pizza-flow.xml <?xml version="1.0" encoding="UTF-8"?> <flow xml ...
- Django单元测试(一)
Django测试框架非常简单,首选方法是使用python标准库中的unittest模块. Writing tests Django的单元测试使用python的unittest模块,这个模块使用基于类的 ...
- gzip [选项] 压缩(解压缩)
减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间.gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用. 语法:gzip ...
- centos中忘记root密码问题
centos中root密码问题 几次在虚拟机中安装cenos,都没有提示输入root密码,具体操作如下: 1.在启动的时候,进入启动界面后,按除了Enter键之外的任意键,即可进入该界面.然后 按 ...
- bzoj1046
首先这肯定是一道LIS的变形,这次求的是方案,还要求字典序最小 (注意这个字典序最小是指下标最小而不是数最小) 首先预处理以每个数为首,能组成多长的上升序列(这里我们用单调队列解决) 然后按照位置顺序 ...
- 清理Xcode中无用的 Provisioning Profile.
Xcode中如果添加过多个开发者账号, 慢慢就会发现 Provisioning Profile 有很多, 无用的 Provisioning Profile Xcode也不会自动删除, 想要清理的话, ...
- 【转】foxmail突然打不开了,双击没反应,怎么回事呀
原文网址:http://tieba.baidu.com/p/3492526384 解决方法如下:1.进入foxmail安装目录(默认在D盘Program Files下层,右击foxmail这个文件夹, ...