通过zookeeper实现配置中心热更新

本篇文章主要讲述如何使用zookeeper实现配置中心,以及在修改配置信息时热更新至项目中,无需重启项目即可得到最新的配置信息。
1、自定义Spring加载配置文件的方式
    (1)在Spring配置文件声明自定义的配置文件类 ZookeeperPropertiesConfigure

通过zookeeper实现配置中心热更新_第1张图片

  (2)编写自定义的配置类ZookeeperPropertiesConfigure并继承自 org . springframework . beans . factory . config .PropertyPlaceholderConfigurer类,重写父类中的mergeProperties方法,源码如下:

通过zookeeper实现配置中心热更新_第2张图片
          
    ZookeeperConfig.getConfig()代码如下,listener()方法后面会讲到:
    通过zookeeper实现配置中心热更新_第3张图片
    代码意思是首先从系统配置中如tomcat配置中找到zkHost声明zookeeper地址如“ 192.168.0.23:2181 ”,构建zookeeper连接客户端,根据ZookeeperPropertiesConfigure中配置的初始参数locationList到zookeeper找到名称为该值的znode,并读取该znode的值,该znode的键值对就是我们需要的配置信息,将配置数据封装成properties并放入mergeProperties中,至此Spring就可以加载配置信息了,在java类中直接使用@value注解,在spring配置中使用如 ${dubbo.order.group:order}来获取配置信息。

2、编写zookeeperFactory用于构建zookeeper客户端,代码如下:

通过zookeeper实现配置中心热更新_第4张图片

可以使用如下代码获取配置值
通过zookeeper实现配置中心热更新_第5张图片

zookeeper的maven配置:
          < dependency >
               < groupId > org.apache.zookeeper groupId >
               < artifactId > zookeeper artifactId >
               < version > 3.4.8 version >
           dependency >

3、在zookeeper上注册监听事件
    这是zookeeper的内置功能,可以监听znode上值的更新或删除时通知客户端,通过这个特性可以实现配置文件的热更新功能。
    所以我们要做的是编写listener方法,代码如下:
通过zookeeper实现配置中心热更新_第6张图片

思路是在znode上添加一个监听事件,znode调用 getData()方法会监听znode的删除与更新事件,当监听事件触发时重新加载数据并将值写入properties中。

4、安装部署Zkui
    Zkui 是一个允许在 zookeeper 上进行增删查改操作的图形管理工具,利用它我们可以编辑配置信息。
       1) 拉取代码     #git clone https://github.com/DeemOpen/zkui.git
     2) 构建并安装程序
        #cd zkui/
        #yum install -y maven
        #mvn clean install
    3) 修改配置文件
    #cp config.cfg target/
    #cd target/
    #vim config.cfg
        serverPort=9090     # 指定启动端口
        zkServer=192.168.0.23:2181    #指定zookeeper地址
        userSet = {"users": [{ "username":"admin" , "password":"admin","role": "ADMIN" },{ "username":"appconfig" , "password":"appconfig","role": "USER" }]}   # 设置登录用户及其权限
     4) 启动程序     #nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar &
   5) 用浏览器访问,地址是: http://192.168.0.23:9090 ,访问后的页面如下,点击name就可以在编写配置信息了,注意跟你 ZookeeperPropertiesConfigure中配置的 locationList参数名匹配哟,不然取不到配置信息。
通过zookeeper实现配置中心热更新_第7张图片


总结:要实现配置文件热更新,需要了解spring加载配置文件的流程从而重写配置加载类,修改成从zookeeper中加载数据,第二要了解zookeeper数据存储的方式以及监听事件的使用。

你可能感兴趣的:(java)