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配置看这一篇就够了
[From]https://blog.csdn.net/yydriver/article/details/81107954 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载 ...
- Zookeeper 配置和原理探究
一 Zookeeper是什么? 服务集群对外提供服务的过程中,有很多的配置需要随时更新,服务间需要协调工作,那么这些信息如何推送到各个节点?并且保证信息的一致性和可靠性?我们知道分布式协调服务很难正确 ...
- 【Zookeeper系列】ZooKeeper安装配置(转)
原文链接:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...
- Mac OS Storm+Kafka+Zookeeper配置
先补充一个前两天mac配置的文档. 首先确定由jdk scala环境 JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/Cu ...
- ZooKeeper系列4:ZooKeeper API简介及编程
问题导读: 1.ZooKeeper API 共包含几个包? 2.如何使用ZooKeeper API 创建zookeeper应用程序? 1)ZooKeeper API 简介 ZooKeeper AP ...
- solrCloud+tomcat+zookeeper配置
一.环境准备: Solr版本:4.7.0 下载地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/4.7.0 Tomcat版本:6.0.39 下载地 ...
- Java开发机器上的配置及zookeeper配置
Java开发机器上的配置及zookeeper配置 /etc/profile 文件的后面加入下面的内容: # jdk, zookeeper, kafka, ant, maven export APACH ...
- Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群
ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...
- zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析
程序的发展,需要引入集中配置: 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境.分集群管理配 ...
随机推荐
- poj2135
加深对最小费用最大流的理解题 题目求无向图来回和最短的路径,每条边只能走一次 不难想到,无向图中来回等于从源点出发走两条不同路径到汇点(区别于k短路,这里每条边只能走一次): 考虑到边的限制,不难想到 ...
- can't able to update the design capacity in bq27441-G1
/*************************************************************************** * can't able to update ...
- 【Markdown】Writing on Github - 在GitHub上写作
Writing on GitHub https://github.com/shalliestera/Writing-on-GitHub-Chinese-Translation Markdown 基本语 ...
- Centos 下Nginx 自启动脚本
#!/bin/bash #ckconfig: NGINX_PATH=/web/container/nginx- NGINX_COMMAND=$NGINX_PATH/sbin/nginx NGINX_P ...
- ORACLE参数文件
一.oracle pfile/spfile区别 pfile 默认的名称为“init+例程名.ora”文件路径:E:\oracle\product\10.2.0\db_1\dbs,这是一个文本文件 ...
- Iterator和ListIterator区别
我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器).使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了. 但是在使用 ...
- Codeforces 629C Famil Door and Brackets DP
题意:给你一个由括号组成的字符串,长度为m,现在希望获得一个长度为n(全由括号组成)的字符串,0<=n-m<=2000 这个长度为n的字符串要求有两个性质:1:就是任意前缀,左括号数量大于 ...
- jetty属性
jetty 版本信息 Jetty7 - 此插件更名为jetty-maven-plugin,以便更符合maven2的协定.为了在Web应用做快速应用开发做准备,详见多Web应用源目录. 为 ...
- Leetcode OJ : Triangle 动态规划 python solution
Total Accepted: 31557 Total Submissions: 116793 Given a triangle, find the minimum path sum from ...
- leetcode—word ladder II
1.题目描述 Given two words (start and end), and a dictionary, find all shortest transformation sequence( ...