分布式系统中经常涉及到配置资源的管理,比如,一个应用系统需要部署在多台服务器上,但是他们拥有某些的配置项是相同的,如果配置变更,需要修改这些配置,那么需要同时修改每台服务器,这样做比较麻烦而且容易出错。类似于这样的资源配置管理完全可以交给zookeeper进行管理,将需要配置的资源保存在zookeeper,当配置数据变化时,zookeeper会将变化信息发布到所有侦听zookeeper的服务器,服务器上的应用就可以从zookeeper中获取最新的配置信息。本文主要介绍如何通过Curator架构,使用zookeeper构建一个简单的配置资源管理系统。

系统架构

本文示例如下图所示,系统由三个部分组成,server端,zookeeper端和controller端,server端包含三个运行相同配置app的server,监听zookeeper中的conf节点。controller端用于操作zookeeper中的数据节点,当用户通过controller更新conf节点,三个server都会收到NodeDataChange消息。

Code

为演示简单起见,Serevr1, Srever2, Server3运行的代码一致,代码主要包含以下几个部分:

1.zookeeper需要存储的数据bean,这里我们使用json对bean 对象进行序列化。

package com.zte.zoo.keeper.configuration;

/**
* Created by majun on 15/10/29.
*/
public class ConfigBean {
private String url;
private String port;
private String name;
private String pwd; public String getUrl() {
return url;
} public ConfigBean setUrl(String url) {
this.url = url;
return this;
} public String getPort() {
return port;
} public ConfigBean setPort(String port) {
this.port = port;
return this;
} public String getPwd() {
return pwd;
} public ConfigBean setPwd(String pwd) {
this.pwd = pwd;
return this;
} public String getName() {
return name;
} public ConfigBean setName(String name) {
this.name = name;
return this;
} @Override
public String toString() {
return GsonUtils.toJson(this);
}
}

2.Server端运行的app code如下所示,主函数使用curatorwatch监听zookeeper的conf节点,当收到数据变化事件通知,打印

public class Server{
public static void main(String[] args) {
private final String serverName="app2";
final CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
try {
client.getData().usingWatcher(new CuratorWatcher() {
public void process(WatchedEvent watchedEvent) throws Exception {
if (Watcher.Event.EventType.NodeDataChanged == watchedEvent.getType()) {
String data = new String(client.getData().forPath(watchedEvent.getPath()));
System.out.println(serverName + " recv data:" + GsonUtils.fromJson(data, ConfigBean.class));
}
}
}).forPath("/conf");
} catch (Exception e) {
e.printStackTrace();
}
while (true) ;
} }

3.Controller端运行的控制代码,更新zookeeper中具有PERSISTENT属性的conf节点

public class Controller {
public static void main(String[] args) throws Exception {
CuratorFramework newClient = CuratorFrameworkFactory.newClient("127.0.0.1:2181", new ExponentialBackoffRetry(1000, 3));
newClient.start();
ConfigBean configBean = new ConfigBean()
.setUrl("192.168.1.1")
.setPort("8000")
.setName("majun")
.setPwd("123");
// createNode(newClient, "/conf", CreateMode.PERSISTENT, configBean.toString()); updateNodeDate(newClient,"/conf",configBean.setName("xiaoya--").toString());
}
public static void createNode(CuratorFramework newClient, String path, CreateMode createMode, String data) {
try {
newClient.create().withMode(createMode).forPath(path, data.getBytes());
} catch (Exception e) {
System.out.println("创建节点失败, elog=" + e.getMessage());
}
}
public static void updateNodeDate(CuratorFramework newClient, String path, String data) {
try {
newClient.setData().forPath(path, data.getBytes());
} catch (Exception e) {
System.out.println("更新节点数据失败, elog=" + e.getMessage());
}
} }

4.json序列化工具类

public class GsonUtils {
private static Gson gson = new Gson(); public static String toJson(Object obj) {
return gson.toJson(obj);
}
public static Object fromJson(String json, Class cla) {
return gson.fromJson(json, cla);
}
}

Test

启动zookeeper, 使用controller中的创建节点函数创建conf节点,然后分别启动三个server,使用controller中的更新函数更新节点,会在三个server打印的更新数据信息。

Conclusion

本文和大家分享了如何基于curator框架使用zookeeper构建统一资源管理系统,希望能够对大家有所帮助。

基于zookeeper实现统一资源管理的更多相关文章

  1. 基于ZK构建统一配置中心的方案和实践

    背景: 近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见.如果恰巧您也使用或者接触过类似的东西, 也希望您可以分享下您觉得现在这个项目可以优化和改进的地方. 项 ...

  2. 基于ZooKeeper的分布式锁和队列

    在分布式系统中,往往需要一些分布式同步原语来做一些协同工作,上一篇文章介绍了Zookeeper的基本原理,本文介绍下基于Zookeeper的Lock和Queue的实现,主要代码都来自Zookeeper ...

  3. 基于ZooKeeper的分布式Session实现(转)

    1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...

  4. 基于ZooKeeper的分布式Session实现

    1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...

  5. 分布式学习(一)——基于ZooKeeper的队列爬虫

    zookeeper 一直琢磨着分布式的东西怎么搞,公司也没有相关的项目能够参与,所以还是回归自己的专长来吧--基于ZooKeeper的分布式队列爬虫,由于没什么人能够一起沟通分布式的相关知识,下面的小 ...

  6. Azure上搭建ActiveMQ集群-基于ZooKeeper配置ActiveMQ高可用性集群

    ActiveMQ从5.9.0版本开始,集群实现方式取消了传统的Master-Slave方式,增加了基于ZooKeeper+LevelDB的实现方式. 本文主要介绍了在Windows环境下配置基于Zoo ...

  7. 基于Zookeeper的分步式队列系统集成案例

    基于Zookeeper的分步式队列系统集成案例 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, ...

  8. ZooKeeper系列(2)--基于ZooKeeper实现简单的配置中心

    ZooKeeper节点的类型分为以下几类:  1. 持久节点:节点创建后就一直存在,直到有删除操作来主动删除该节点 2. 临时节点:临时节点的生命周期和创建该节点的客户端会话绑定,即如果客户端会话失效 ...

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

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

随机推荐

  1. ExtJS基础知识总结:自定义日历和ComboBox控件(二)

    概述 1.ExtJS 5不支持日期选择框中只选择年月,为了满足ExtJs5可以实现选择年月的功能,查询网上资料,整理出来了相应的处理方式,最终实现的效果如下图: 2.ExtJS 控件丰富,如果需要实现 ...

  2. Breakpad Google的crash捕获、抓取开源库

    简介: Breadpad为google chrominum项目下用于处理dump的一套工具:内部采用跨平台方式实现捕获.生成.解析与平台无关的dump,便于统一处理:支持进程内与进程外捕获,当为进程外 ...

  3. HBase基本shell命令

    HBase基本shell命令 以下shell命令都是经过测试,正常展示,若有不足,还望指点! 1.创建表 create ‘表名称’,‘列族名称1’,‘列族名称1’create 'test_M_01', ...

  4. 微信小程序简介

    什么是微信小程序? 今年下半年的时候,微信推出了微信小程序,当然刚刚推出来的时候还是处于内测阶段,但是这并不影响这家伙的热度,也许这是一个新的时代的开启.但是什么是微信小程序呢?微信应用号是一个app ...

  5. PDA手持扫描资产标签,盘点完成后将数据上传到PC端,固定资产系统查看盘点结果

    固定资产管理系统介绍: 致力于研发条码技术.集成条码系统的专业性公司,针对客户的不同需求,提供一站式的企业条码系统解决方案:包括功能强大的软件系统.安全可靠的无线网络.坚固耐用的硬件系统.灵活易用的管 ...

  6. (转)java自带线程池和队列详细讲解 - CSDN过天的专栏

    一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.util ...

  7. 全局变量 HInstance 到底是在什么时候赋值的?

    在学习 资源文件 和 钩子函数 时, 经常用到当前模块句柄(HInstance)这个全局变量. 今天特别想知道, 它到底是在什么时候给赋值的. 输入 HInstance; "Ctrl+鼠标& ...

  8. Objective-C开发编码规范【转载】

    概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序.关于Objective-C的编码规范,苹果和谷歌都已经有很好的总结: Apple Coding Guide ...

  9. Gulp常用前端流程自动化配置

    前言 近期的项目全部由Grunt + LESS 转向改用Gulp + SASS 进行前端开发,也就奔着Gulp那比较好用的自定义函数而来的. 一.package.json文件配置如下: { " ...

  10. SOAPUI使用教程-REST Service Mocking

    REST服务模拟 REST服务模拟功能允许您创建一个REST服务模拟器-MockService . 好处 RESTMockServices可用于例如: Web服务的原型 ——几秒内从请求生成一个完整的 ...