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

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

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

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

通过zookeeper实现配置中心热更新
        
    ZookeeperConfig.getConfig()代码如下,listener()方法后面会讲到:
   通过zookeeper实现配置中心热更新
    代码意思是首先从系统配置中如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实现配置中心热更新

可以使用如下代码获取配置值
通过zookeeper实现配置中心热更新

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

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

思路是在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实现配置中心热更新


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