关键词:
??ZooKeeper的Watcher事件机制可以说分布式场景下的观察者模式的实现。基于这个watcher事件机制,配合注册到特定的ZNode节点,可以实现java应用的配置运行时的变更。在学习zookeeper之前,听同事说配置可以在运行时动态变更,觉得不可思议。研习了zookeeper之后,实现这个功能是很easy的。
??发布/订阅系统设计起来无非两种模式,推和拉。
1. 推模式,服务端负责把变更的数据推给订阅的客户端。Web即时通信里的Comet技术便可以实现这种功能。
2. 拉模式,也就是客户端定时轮询服务端。拉模式不仅有延迟,给服务端带来很大压力,而且十分低效。
??zookeeper采用的是推拉结合的模式
1. 客户端订阅znode节点
2. 被订阅的节点发生变化后,zookeeper服务端向客户端发生数据变更的watcher事件通知
3. 客户端接收到watcher通知后,主动从服务端拉取变更的数据
??阿里的配置变更中间件diamond,同样是基于推拉结合的模式来实现数据的动态变更。初学zookeeper,写了一个数据库配置动态变更的demo。zookeeper自带的Watcher注册后,数据变更一次便会自动取消注册。这个设计实在反人类,大多数的开发者的需求肯定是注册一次,服务终生。所以转向开源的ZkClient客户端。
??首先本地需要启动一个zookeeper的服务端,并且有一个“/db”节点,我用这个节点存储数据库配置信息。
??客户端工程需要引入zookeeper和zkclient的依赖。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>com.github.adyliu</groupId>
<artifactId>zkclient</artifactId>
<version>2.1.1</version>
</dependency>
??客户端demo
import com.github.zkclient.IZkDataListener;
import com.github.zkclient.ZkClient;
import java.io.IOException;
/**
* project : zk
* package : PACKAGE_NAME
* author : lvsheng
* date : 2016/10/5 下午11:17
*/
public class ZkClientTest {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
zkClient.subscribeDataChanges("/db", new IZkDataListener() {
public void handleDataChange(String dataPath, byte[] data) throws Exception {
System.out.println(new String(data));
}
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println(dataPath);
}
});
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
??现在我们来测试这个功能,在控制台依次输入如下命令:
[zk: localhost:2181(CONNECTED) 48] set /db chat.jdbc.driver=com.mysql.jdbc.Driver|chat.jdbc.url=jdbc:mysql://192.168.146.120:3306/chat_test?useUnicode=true&amp;characterEncoding=GBK|chat.jdbc.maxActive=5
[zk: localhost:2181(CONNECTED) 49] set /db chat.jdbc.driver=com.mysql.jdbc.Driver|chat.jdbc.url=jdbc:mysql://127.0.0.1:3306/chat_test?useUnicode=true&amp;characterEncoding=GBK|chat.jdbc.maxActive=5
??观察Java代码的输出
chat.jdbc.driver=com.mysql.jdbc.Driver|chat.jdbc.url=jdbc:mysql://192.168.146.120:3306/chat_test?useUnicode=true&amp;characterEncoding=GBK|chat.jdbc.maxActive=5
chat.jdbc.driver=com.mysql.jdbc.Driver|chat.jdbc.url=jdbc:mysql://127.0.0.1:3306/chat_test?useUnicode=true&amp;characterEncoding=GBK|chat.jdbc.maxActive=5
??数据库配置的ip被成功的动态修改。
zookeeper应用场景
Zookeeper(四)应用场景Zookeeper应用场景数据发布/订阅命名服务集群管理Master选举分布式锁排他锁共享锁分布式队列FIFO先⼊先出Barrier:分布式屏障Zookeeper应用场景ZooKeeper是⼀个典型的发布/订阅模式的分布式数据管理... 查看详情
zookeeper应用场景
Zookeeper(四)应用场景Zookeeper应用场景数据发布/订阅命名服务集群管理Master选举分布式锁排他锁共享锁分布式队列FIFO先⼊先出Barrier:分布式屏障Zookeeper应用场景ZooKeeper是⼀个典型的发布/订阅模式的分布式数据管理... 查看详情
zookeeper的作用用途
...统中不参与服务的调用和传输,就是发布者将数据发布到zookeeper节点上,供订阅者动态的获取数据实现配置信息集中式管理和动态更新,类似场景就是应用在启动时会主动来获取一次配置,同时在节点上注册一个wacther,这样一... 查看详情
观察者模式(observer)和发布(publish/订阅模式(subscribe)的区别
最近在学习dubbo,学到dubbo自然要接触注册中心zookeeper,zookeeper里涉及发布和订阅问题。观察者模式之JAVA实现:JAVA设计模式之观察者模式发布订阅模式之JAVA实现:发布者订阅者模式之JAVA实现 观察者模式(Observer... 查看详情
关于zookeeper
Zookeeper是分布式协调工具应用场景 命名服务(注册中心)Dubbo注册中心 分布式配置中心(SpringCloudconfig)动态管理配置文件信息 消息中间件事件通知(类似发布订阅) 分布式事务(全局协... 查看详情
zookeeper
zookeeper是一个开源的分布式协调服务,是由雅虎创建的,基于googlechubby。 zookeeper是什么分布式数据一致性的解决方案 zookeeper能做什么数据的发布/订阅(配置中心:disconf) 、负载均衡(dubbo利用了zookeeper机制实现负载... 查看详情
zookeeper(代码片段)
一、理论篇(一)1.1概述 Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。 Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关... 查看详情
一文读懂zookeeper--万字长文肝就完了(代码片段)
1.zookeeper在分布式集群的作用1.1,数据发布与订阅(配置中心)发布与订阅模型,即所谓的配置中心,顾名思义就是讲发布者将数据发布到zk节点上,共订阅者动态获取数据,实现配置的集中式管理和动... 查看详情
zookeeper概念(代码片段)
Zookeeper介绍 Zookeeper是一个高可用的分布式数据管理与系统协作框架。基于对Paxos算法实现,该框架保证了分布式环境中数据的强一致性,也正是基于这样的特性,使得Zookeeper可以解决很多分布式问题。 它可以实现的功能... 查看详情
zookeeper:功能和原理
简介ZooKeeper是一个开源的分布式协调服务,由雅虎创建,是GoogleChubby的开源实现。分布式应用程序可以基于ZooKeeper实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master选举、配置维护,名字服务、... 查看详情
项目方案利用zookeeper实现集群缓存一致
背景 我们项目是集群部署的,通过DUBBO注册到Zookeeper上。 对于一些配置值,会在项目启动后会从数据库查询并加载到各主机缓存中。现在存在这样的问题,当A主机修改了该配置值并更新对应缓存后,如何... 查看详情
zookeeper应用场景(代码片段)
...中心主动触发应用重新加载配置以满足实时修改的要求。zookeeper服务就可以当作配置中心来用-首先将配置信息存放到zookeeper的**持久化znode**中。-同时在这些znode上注册数据变更的watch监听。-各应用中集成zookeeper客户端,这些应... 查看详情
关于zookeeper
Zookeeper是分布式协调工具应用场景 命名服务(注册中心)Dubbo注册中心 分布式配置中心(SpringCloudconfig)动态管理配置文件信息 消息中间件事件通知(类似发布订阅) 分布式事务(全局协... 查看详情
zookeeper的典型应用场景(代码片段)
《从Paxos到Zookeeper分布式一致性原理与实践》读书笔记本文:总结脑图地址:脑图前言所有的典型应用场景,都是利用了ZK的如下特性:强一致性:在高并发情况下,能够保证节点的创建一定是全局唯一的。Watcher机制和异步通知... 查看详情
zookeeper入门与安装(代码片段)
一、zookeeper的应用场景zookeeper是一个分布式的统一文件协调管理系统管理系统。它的数据类型与linux、unix类似,是一棵树的结构。在日常的生产开发生产中,它具有以下的作用。1、集群管理,保证集群中的数据的强一致性。如... 查看详情
使用redis的发布订阅模式实现消息队列
配置文件<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org 查看详情
eventbus发布-订阅模式(使用代码实现发布-订阅模式)(代码片段)
文章目录一、发布-订阅模式二、代码实现发布-订阅模式1、订阅者接口2、订阅者实现类3、发布者4、调度中心5、客户端一、发布-订阅模式发布订阅模式:发布者Publisher:状态改变时,向消息中心发送事件;订阅者Subscriber:到消息中心... 查看详情
redispub/sub发布订阅模式的深度解析与实现消息队列(代码片段)
...ubsub_channels6.2pubsub_patterns7Pub/Sub缺点1Pub/Sub的概述我们可以利用Redis的List数据结构实现一个简单的消息队列,通过lpush命令写入消息& 查看详情