Zookeeper实现参数的集中式管理【面试+工作】

前言

应用项目中都会有一些参数,一般的做法通常可以选择将其存储在本地配置文件或者内存变量中;对于集群机器规模不大、配置变更不是特别频繁的情况下,这两种方式都能很好的解决;但是一旦集群机器规模变大,且配置信息越来越频繁,依靠这两种方式就越来越困难;我们希望能够快速的做到全局参数的变更,因此需要一种参数的集中式管理,下面利用Zookeeper的一些特性来实现简单的参数管理。

准备

Maven引入

目标

1.可以同时配置监听多个节点如/app1,/app2;

2.希望只需要配置如/app1,就能够监听其子节点如/app1/modual1以及子节点的子节点如/app1/modual1/xxx/…;

3.服务器启动能获取当前指定父节点下的所有子节点数据;

4.在添加节点或者在更新节点数据的时候能够动态通知,这样代码中就能够实时获取最新的数据;

5.spring配置中可以从Zookeeper中读取参数进行初始化。

实现

提供ZKWatcher类主要用来和Zookeeper建立连接,监听节点,初始化节点数据,更新节点数据,存储节点数据等

1.同时配置监听多个节点

提供一个字符串数组给用户用来添加需要监听的节点:

2.能够监听其子节点以及子节点的子节点

使用递归的方式用来获取指定监听节点的子节点:

3.服务器启动初始化节点数据

上面已经递归获取了所有的节点,所有可以遍历获取所有节点数据,并且存储在Map中:

4.监听节点数据的变更

使用PathChildrenCache用来监听子节点的CHILD_ADDED,CHILD_UPDATED,CHILD_REMOVED事件:

5.spring配置中可以从Zookeeper中读取参数进行初始化

实现自定义的PropertyPlaceholderConfigurer类ZKPropPlaceholderConfigurer:

通过以上的处理,可以使用如下简单的配置来达到目标:

详细代码svn地址:http://code.taobao.org/svn/temp-pj/DynamicConf

测试

1.首先启动Zookeeper

2.初始化需要使用的节点

创建需要的节点方便ZKWatcher来监听,这里根据以上的配置,分别初始化/a3/m1/v2/t2和/a2/m1/v1/t1

3.启动Main,分别验证配置文件中的初始化以及代码动态获取参数

4.观察日志同时更新参数:

部分日志如下:

总结

通过Zookeeper实现了一个简单的参数化平台,当然想在生产中使用还有很多需要优化的地方,本文在于提供一个思路;当然除了Zookeeper还可以使用MQ,分布式缓存等来实现参数化平台。

原文发布于微信公众号 - Java帮帮(javahelp)

原文发表时间:2018-10-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

理解Cookie和Session机制

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确...

1911
来自专栏编程坑太多

『中级篇』在docker-swarm集群里通过serivce部署wordpress(46)

PS :不知道大家还有没有影响讲docker的多机网络的时候,多机的overlay网络的时候,使用的第三方的kv的外置的第三方的存储etcd。我们在用了swar...

1164
来自专栏一“技”之长

Git命令集十三——快照操作 原

    Git工具中提供了一个stash命令,这个命令的作用是创建快照。快照主要的用途是将当前未更新到缓存区的修改进行入栈保存,创建快照后,Git的状态会变回上...

942
来自专栏开源优测

AutoLine源码分析之Flask初始化模块

下面我们看下在manage.py中如何调用create_app来初始化全局flask运行环境的。

1553
来自专栏面朝大海春暖花开

properties文件乱码问题 eclipse

java最常用的开发工具eclipse里面的properties配置文件里面打开中文是乱码的,解决方式很简单。

4682
来自专栏用户2442861的专栏

push到github时,每次都要输入用户名和密码的问题

http://blog.csdn.net/yuquan0821/article/details/8210944

1011
来自专栏Java后端技术

Linux系统基础知识整理

  本篇文章,我将结合自己的实践以及简介,来对linux系统做一个直观清晰的介绍,使得哪些刚接触Linux的小伙伴可以快速入门,也方便自己以后进行复习查阅。

1687
来自专栏Java帮帮-微信公众号-技术文章全总结

Linux常用命令

Linux常用命令 常用指令 ls   显示文件或目录 -l 列出文件详细信息l(list) -a ...

5316
来自专栏pangguoming

angular之interceptors拦截器

<!DOCTYPE html> <html ng-app="nickApp"> <head> <meta charset="UTF-8"> <m...

4065
来自专栏专注研发

linux常用命令

     -a          列出当前目录下所有文件及目录,包括隐藏的a(all)

2011

扫码关注云+社区

领取腾讯云代金券