利用zookeeper的发布/订阅模式实现配置动态变更

bruce128 bruce128     2022-08-07     640

关键词:

??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;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;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;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;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命令写入消息& 查看详情