目录

一、概述

二、案例


一、概述

在分布式系统中,每个微服务可能都会有自己的配置文件信息,比如数据库连接、用户名和密码信息都配置在配置文件中,微服务读取配置文件,将配置文件信息存入缓存中。

假设我们的配置信息发生变化时,我们还需要重新加载缓存,这比较麻烦。在zookeeper中,我们学习了watcher监听机制,利用监听机制可能轻松实现当配置信息发生变化时,应用程序第一时间发现配置变化并重新加载最新的配置信息。

二、案例

这里我们以一个简单的案例说明在zookeeper中如何利用watcher监听机制实现客户端对配置信息的动态感知。

实现步骤大体如下:

  • 1、使用终端在zookeeper中事先创建一些配置信息;
  • 2、Java客户端连接到zookeeper服务器;
  • 3、客户端读取zookeeper中的配置信息,并且注册watcher监听,将配置信息保存起来;
  • 4、使用终端对zookeeper中的配置信息进行修改;
  • 5、客户端监听到zookeeper中的配置已经更改,通过watcher的回调方法捕获到节点数据变化事件;
  • 6、客户端重新获取到最新的配置;

【a】使用终端在zookeeper中事先创建一些配置信息

[zk: localhost:2181(CONNECTED) 43] create /dbconfig "dbconfig"
Created /dbconfig
[zk: localhost:2181(CONNECTED) 44] create /dbconfig/url "jdbc:oracle:thin:@192.168.2.58:1521:orcl"
Created /dbconfig/url
[zk: localhost:2181(CONNECTED) 45] create /dbconfig/username "wfwzhxg"
Created /dbconfig/username
[zk: localhost:2181(CONNECTED) 46] create /dbconfig/password "wfwzhxg"
Created /dbconfig/password
[zk: localhost:2181(CONNECTED) 47] ls /dbconfig
[password, url, username]

以上我们创建了三个节点:

  • url:jdbc:oracle:thin:@192.168.2.58:1521:orcl
  • username:wfwzhxg
  • password:wfwzhxg

【b】Java客户端相关代码

import com.wsh.zookeeper.zookeeperapidemo.watcher.ZookeeperWatcherExists;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.io.IOException;
import java.util.concurrent.TimeUnit;public class ZookeeperConfigDemo {private String url;private String username;private String password;private static final String ZOOKEEPER_SERVER_ADDRESS = "192.168.179.133:2181";private static final Logger logger = LoggerFactory.getLogger(ZookeeperWatcherExists.class);private static ZooKeeper zooKeeper = null;public ZookeeperConfigDemo() {try {Watcher watcher = new Watcher() {@Overridepublic void process(WatchedEvent event) {try {// 捕获事件状态if (event.getType() == Event.EventType.None) {if (event.getState() == Event.KeeperState.SyncConnected) {logger.info("连接成功...");} else if (event.getState() == Event.KeeperState.Disconnected) {logger.info("连接断开...");} else if (event.getState() == Event.KeeperState.Expired) {logger.info("连接超时...");// 超时后服务器端已经将连接释放,需要重新连接服务器端zooKeeper = new ZooKeeper(ZOOKEEPER_SERVER_ADDRESS, 3000, this);} else if (event.getState() == Event.KeeperState.AuthFailed) {logger.info("验证失败...");}} else if (event.getType() == Event.EventType.NodeDataChanged) {// 当配置信息发生变化时initValue();}} catch (Exception ex) {ex.printStackTrace();}}};zooKeeper = new ZooKeeper(ZOOKEEPER_SERVER_ADDRESS, 3000, watcher);initValue();} catch (IOException e) {e.printStackTrace();}}private void initValue() {this.url = getDbUrl();this.username = getDbUsername();this.password = getDbPassword();}private String getDbUrl() {try {byte[] urlData = zooKeeper.getData("/dbconfig/url", true, null);return new String(urlData);} catch (KeeperException | InterruptedException e) {e.printStackTrace();}return null;}private String getDbUsername() {try {byte[] data = zooKeeper.getData("/dbconfig/username", true, null);return new String(data);} catch (KeeperException | InterruptedException e) {e.printStackTrace();}return null;}private String getDbPassword() {try {byte[] data = zooKeeper.getData("/dbconfig/password", true, null);return new String(data);} catch (KeeperException | InterruptedException e) {e.printStackTrace();}return null;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public static void main(String[] args) throws InterruptedException {ZookeeperConfigDemo zookeeperConfigDemo = new ZookeeperConfigDemo();for (int i = 0; i < 30; i++) {TimeUnit.SECONDS.sleep(10);System.out.println("dburl : " + zookeeperConfigDemo.getDbUrl());System.out.println("dbusername : " + zookeeperConfigDemo.getDbUsername());System.out.println("dbpassword : " + zookeeperConfigDemo.getPassword());System.out.println("####################################################");}}}

【c】使用终端对zookeeper中的配置信息进行修改

[zk: localhost:2181(CONNECTED) 53] set /dbconfig/username zhxg2       #修改用户名
cZxid = 0xfa
ctime = Fri Dec 25 10:41:09 CST 2020
mZxid = 0x106
mtime = Fri Dec 25 11:03:15 CST 2020
pZxid = 0xfa
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 54] set /dbconfig/password zhxg2        #修改密码
cZxid = 0xfb
ctime = Fri Dec 25 10:41:16 CST 2020
mZxid = 0x107
mtime = Fri Dec 25 11:03:18 CST 2020
pZxid = 0xfb
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 5
numChildren = 0
[zk: localhost:2181(CONNECTED) 55] set /dbconfig/url jdbc:oracle:thin:@192.168.35.106:1521:orcl  #修改数据库连接URL
cZxid = 0xf9
ctime = Fri Dec 25 10:40:58 CST 2020
mZxid = 0x108
mtime = Fri Dec 25 11:03:21 CST 2020
pZxid = 0xf9
cversion = 0
dataVersion = 2
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 42
numChildren = 0

【d】客户端动态感知配置变化

观察后端日志:

dburl : jdbc:oracle:thin:@192.168.2.58:1521:orcl
dbusername : zhxg2
dbpassword : zhxg
####################################################
dburl : jdbc:oracle:thin:@192.168.2.58:1521:orcl
dbusername : zhxg2
dbpassword : zhxg2
####################################################
dburl : jdbc:oracle:thin:@192.168.35.106:1521:orcl
dbusername : zhxg2
dbpassword : zhxg2
####################################################

可以看到,客户端实时监听到zookeeper服务端配置信息的变化。

Zookeeper案例之监听配置中心相关推荐

  1. Oracle监听配置

    经验告诉我:最好把数据库的SID和数据库全局名称分开,免得配置时混了,如果要配置服务器端和客户端时,服务器端和客户端都需要配置,并且配置方法一样. 一.监听器(LISTENER)      监听器是O ...

  2. Orace 11g 监听 配置修改 说明

    在之前的Blog中有三篇文章提到了Oracle的监听,如下: OracleListener 动态注册 与 静态注册 http://blog.csdn.net/tianlesoftware/articl ...

  3. Oracle数据库监听配置|转|

    http://article.pchome.net/content-340501.html 近段时间很多网友提出监听配置相关问题,客户终端(Client)无法连接服务器端(Server).本文现对监听 ...

  4. Linux7/Redhat7/Centos7 安装Oracle 12C_监听配置及DBCA安装数据库_05

    文章目录 一.监听配置 二.创建数据库 一.监听配置 # 切换到oracle用户 su - oracle# 启动监听图形化页面 netca 二.创建数据库 dbca

  5. aix oracle监听配置_Oracel:ORA-12518:监听程序无法分发客户机连接

    一.[问题描述] 最近,在系统高峰期的时候,会提示如上的错误,致使无法连接到服务器上的数据库. 二.[分析过程] 1.首先判断是否由于监听配置不正确的原因导致? 系统在正常情况下都可以正常的使用,检查 ...

  6. Oracle 数据库监听配置

    一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它也只存在于数据库服务器端,进行监听器的 ...

  7. Spring,SpringMvc初始化监听配置

    SpringMvc初始化完成之后启动监听配置方式 主要是解决spring初始化过程中由于bean容器初始化顺序不同导致注入异常 在springmvc.xml中通过bean注入监听器 监听实现类实现Ap ...

  8. Oracle11g数据库监听配置

    (转自:http://blog.sina.com.cn/s/blog_6908928501018057.html) 经验告诉我:最好把数据库的SID和数据库全局名称分开,免得配置时混了,如果要配置服务 ...

  9. oracle 监听 多个实例,oracle 监听(多实例监听配置)

    这里将告诉您oracle 监听(多实例监听配置),教程操作步骤: 三种情况: 1.一个监听在一个IP一个端口上监听多个实例 2.一个监听在一个IP不同端口上监听多个实例 3.多个监听监听多个实例 情况 ...

  10. Oracle监听注册和sqlnet,Oracle监听配置(四)--如何实现静态、动态注册

    Oracle监听配置(四)--如何实现静态.动态注册 第三节我们已经大概了解什么是静态注册和动态注册,下面我们将通过两个例子来更加深入了解它们之间的区别. 静态注册:当listener使用的是非标准端 ...

最新文章

  1. 教你创建高大上的多边形字体
  2. SQL Server优化50法
  3. java ranger rest_kafka ranger integration issuse
  4. MongoDB中文社区年终盛典
  5. java 多线程 8 : 线程通信
  6. 类火墙的iptables
  7. eclipse在线汉化站点
  8. markdown学习笔记(1):如何将.md文件转换为pdf
  9. Pygame实战之外星人入侵NO.7——大批外星人来袭
  10. 鸟哥惠新宸:PHP 7.1 的新特性我并不是很喜欢
  11. 如何从iPhone的音乐应用程序中删除Apple Music
  12. linux adb arm移植,移植ubuntu core到Arm开发板
  13. 新浪微博PC端模拟登陆
  14. 【机器学习】机器学习的基本概念/术语2
  15. 君子慎独,卑以自牧!
  16. 如何将普通交换机实现POE供电?
  17. CCF真题 ISBN号码 题解
  18. 计算机网红,网红短句
  19. 简书上使用markdown
  20. WordPress批量删除文章失效图片_批量删除文章404超链接教程

热门文章

  1. java file 其他电脑上_将MultipartFile转换为java.io.File而不复制到本地计算机
  2. 自动驾驶7-4 自动驾驶汽车简介全面总结 Congratulations on Completing Course 1
  3. 丢弃法(基于MXNet)
  4. 在执行某个行为时,其大脑是否产生了对应的稳定脑神经模式映射?如果存在稳定映射,是否能运用机器学习方法发现未知行为神经回路?
  5. 451.根据字符出现频率排序
  6. MVC设计模式:概念,模型,视图,控制器
  7. 镜像串之字符串常量用处
  8. centos中mysql操作命令_CentOS系统常用的MySQL操作命令总结
  9. 后台数据量太大传输慢_哪些因素会导致慢查询?
  10. 【机器学习系列】GMM第一讲:两个角度认识高斯混合模型