zookeeper应用 - 配置服务
一端不停的更新配置,另一端监听这个配置的变化。
package config;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
public class ZKUtils {
/**
* 构建zookeeper客户端对象
* @param hosts
* @return
* @throws Exception
*/
public static ZooKeeper open(String hosts) throws Exception {
final CountDownLatch singal = new CountDownLatch(1); ZooKeeper zk = new ZooKeeper(hosts, 2000, new Watcher() {
@Override
public void process(WatchedEvent event) {
singal.countDown();
}
}); singal.await(); return zk;
}
}
ConfigUpdater.java
package config;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
/**
* 不停的更新/test节点上的数据, 模拟配置更新
*
*/
public class ConfigUpdater {
public static final String HOSTS = "hadoop1:2181";
public static final String PATH = "/test"; public static void main(String[] args) throws Exception {
ZooKeeper zk = ZKUtils.open(HOSTS); while(true) {
String data = UUID.randomUUID().toString(); Stat stat = zk.exists(PATH, false);
if(stat == null) {
zk.create(PATH, data.getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
} else {
zk.setData(PATH, data.getBytes("UTF-8"), -1);
} TimeUnit.SECONDS.sleep(5);
}
}
}
ConfigUpdateWatcher .java
package config;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
/**
* 注册监听/test节点上的数据变化
*
*/
public class ConfigUpdateWatcher implements Watcher {
private ZooKeeper zk = null; public ConfigUpdateWatcher() {
try {
zk = ZKUtils.open(ConfigUpdater.HOSTS);
} catch (Exception e) {
e.printStackTrace();
}
} @Override
public void process(WatchedEvent event) {
System.out.println(event); if(event.getType().equals(EventType.NodeDataChanged)) {
try {
//读取事件后, 再次注册数据监听事件
byte[] data = zk.getData(ConfigUpdater.PATH, this, null);
System.out.printf("接收到了事件%s, 新的数据是:%s", EventType.NodeDataChanged, new String(data, "UTF-8"));
System.out.println();
} catch (Exception e) {
e.printStackTrace();
}
}
} private void run() {
try {
//注册数据变化监听
zk.getData(ConfigUpdater.PATH, this, null);
} catch (Exception e) {
e.printStackTrace();
} try {
TimeUnit.SECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
new ConfigUpdateWatcher().run();
}
}
完善
package config;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
/**
* 不停的更新/test节点上的数据, 模拟配置更新
*
*/
public class ConfigUpdater {
public static final String HOSTS = "hadoop1:2181";
public static final String PATH = "/test";
public static final int RETRIES = 3; //重试次数
public static final int RETRY_PERIOD = 500; //重试间隔 public static void main(String[] args) throws Exception {
ZooKeeper zk = ZKUtils.open(HOSTS); //不停的模拟数据更新操作
while(true) { String data = UUID.randomUUID().toString(); /*
* 多次重试,增加可靠性
*/
int retied = 0;
while(true) {
try {
Stat stat = zk.exists(PATH, false);
if(stat == null) {
zk.create(PATH, data.getBytes("UTF-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
} else {
zk.setData(PATH, data.getBytes("UTF-8"), -1);
} //执行成功则跳出循环,否则继续(重试)
break;
} catch (KeeperException e) {
retied++; //如果会话过期了则重新创建一个ZooKeeper客户端对象
if(e.code().equals(KeeperException.Code.SESSIONEXPIRED)) {
zk = ZKUtils.open(HOSTS);
} else {
//其他KeeperException Code的处理 //KeeperException.Code.CONNECTIONLOSS异常可以不用处理:ZooKeeper客户端对象会自动进行重新连接
} //可以重试3次,每次间隔500毫秒
if(retied == RETRIES) {
throw e;
} else {
TimeUnit.MICROSECONDS.sleep(RETRY_PERIOD);
}
}
} //模拟其他操作占用的时间
TimeUnit.SECONDS.sleep(5);
}
}
}
zookeeper应用 - 配置服务的更多相关文章
- ZooKeeper系列1:ZooKeeper的配置
问题导读:1.zookeeper有哪些配置文件?2.zookeeper最低配置需要哪些配置项?3.zookeeper高级配置需要配置哪些项? ZooKeeper 的功能特性通过 ZooKeeper 配 ...
- ZooKeeper学习第二期--ZooKeeper安装配置
一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式. ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境:■ 伪集群模式:就是在一台物 ...
- [转载] zookeeper 分布式锁服务
转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...
- dubbo+zookeeper+springboot构建服务
本次和大家分享的是dubbo框架应用的初略配置和zookeeper注册中心的使用:说到注册中心现在我使用过的只有两种:zookeeper和Eureka,zk我结合dubbo来使用,而Eureka结合s ...
- Zookeeper系列一:Zookeeper介绍、Zookeeper安装配置、ZK Shell的使用
https://www.cnblogs.com/leeSmall/p/9563547.html 一.Zookeeper介绍 1. 介绍Zookeeper之前先来介绍一下分布式 1.1 分布式主要是下面 ...
- ZooKeeper: 简介, 配置及运维指南
1. 概览 ZooKeeper是一个供其它分布式应用程序使用的软件, 它为其它分布式应用程序提供所谓的协调服务. 所谓的协调服务, 是指ZooKeeper的如下能力 naming 命名 configu ...
- 【Zookeeper系列】ZooKeeper安装配置(转)
原文链接:https://www.cnblogs.com/sunddenly/p/4018459.html 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪 ...
- Zookeeper系列四:Zookeeper实现分布式锁、Zookeeper实现配置中心
一.Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性. 包括跨进程.跨机器.跨网络导致共享资源不一致的问题. 1. 分布式锁的实现思路 说明: 这种实现会有一个缺点,即当 ...
- 【转载】ZooKeeper学习第二期--ZooKeeper安装配置
原文地址(https://www.cnblogs.com/sunddenly/p/4018459.html) 一.Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及 ...
随机推荐
- (转)MySQL数据丢失讨论
原文地址:http://hatemysql.com/tag/sync_binlog/ 1. 概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下 ...
- 数据库 -- Oracle常用命令
1.查询账号状态 SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS; 解锁账号 ALTER USER scott ACCOUNT UNLOCK 2.创建表空 ...
- webSQL的基本操作
1.html5以来,数据的前端存储已经有了很大进步.这里简单些一下webSQL的基本用法.代码如下: <!DOCTYPE html> <html> <head> & ...
- redis报Cannot allocate memory错误
昨天16:27开始将dp的日志使用ELK处理,当时redis使用内存的量不是很大,100M多点,结果今天早上到了一看xshell被关掉了,赶紧将各服务启动起来,elasticsearch启动没有问题, ...
- Python开发工具,服务器框架等
python服务器框架:uWSGI WEB服务器.mod_WS.Meinheld.Gunicorn.CherryPy.Bjoern 查看python内部模块命令,内置函数,查看python已经安装的模 ...
- JAVA 图像操作辅助类
package util; import java.awt.Component; import java.awt.Image; import java.awt.MediaTracker; import ...
- 【转】CSS浮动(float,clear)通俗讲解
作者:杨元 本文链接:http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 很早以前就接触过CSS,但对于浮动始终非常迷惑, ...
- [转].Net实现本地化简易教程
本文转自:https://www.cnblogs.com/csdbfans/archive/2011/10/17/2214048.html 实现多语言版本的支持,就是所谓的国际化,也说是本地化. 今天 ...
- js加载事件和js函数定义
一 dom文档树加载完之后执行一个函数 在Dom加载完成后执行函数,下面这三个的作用是一样的,window.onload 是JavaScript的,window.onload是在dom文档树加载完和 ...
- BG.VM--CentOS
1. CentOS 更改IP 局域网配置: 在虚拟机的[网络]连接方式中选择:仅主机(Host-Only)网络. 路径:vim /etc/sysconfig/network-scripts/ifcfg ...