springboot集成disconf实现配置文件实时刷新

时间:2021-10-31 08:53:43

一、disconf介绍


         disconf是百度的一个分布式配置中心,由于我们项目配置文件较多,都是properties文件,虽然也支持实时生效,但是没有一个可视化的WEB端用来管理(每次修改配置文件需要提上线流程上线修改),目前采用disconf来实现


二、springboot集成disconf


       本篇只是一个入门因为还在调研阶段,本篇采用注解方式实现,因为注解实现的可以实时生效而xml的方式需要自己reload到bean里面。

   首先在disconf-web管理后端建一个app和对应的配置文件(这里以监听redis.properties为例)

       在新建的一个app叫做myApp下新建配置文件:
springboot集成disconf实现配置文件实时刷新
   建好后:

  
springboot集成disconf实现配置文件实时刷新
    来看应用:

        springboot的项目结构不是这样重点,主要注意包扫描就行,自己看配置文件,在springboot项目的resources目录下面咱们有2个配置文件,一个是disconf.xml一个是disconf.properties

      disconf.xml配置如下:

      

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

<aop:aspectj-autoproxy proxy-target-class="true"/>

<!-- 以下是基于注解的实现方式 -->
<bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean" destroy-method="destroy">
<property name="scanPackage" value="com.spring.boot.disconf"></property>
</bean>

<bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"
init-method="init" destroy-method="destroy">
</bean>

</beans>

      disconf.properties配置如下:

     
disconf.enable.remote.conf=true
# 这个地址是你disconf-web端的入口地址
disconf.conf_server_host=192.168.80.136:8081/disconf-web/
disconf.version=1_0_0_0
#和刚才web端的配置一样
disconf.app=myApp
disconf.env=local
disconf.debug=true
disconf.conf_server_url_retry_times=1
disconf.conf_server_url_retry_sleep_seconds=1
disconf.user_define_download_dir=./config


     配置文件配置好之后,再来看代码,首先新建一个jedisConfig的类

     

package com.spring.boot.disconf.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import com.baidu.disconf.client.common.annotations.DisconfFile;
import com.baidu.disconf.client.common.annotations.DisconfFileItem;
import com.baidu.disconf.client.common.update.IDisconfUpdate;

@Configuration
@DisconfFile(filename="redis.properties",targetDirPath="/config")
public class JedisConfig implements IDisconfUpdate{

protected static final Logger LOGGER = LoggerFactory
.getLogger(JedisConfig.class);
private String host;
private int port;
@DisconfFileItem(name="redis.host",associateField="host")
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
@DisconfFileItem(name="redis.port",associateField="port")
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
@Override
public void reload() throws Exception {
LOGGER.info("监听的redis数据;IP=" + getHost() + ";端口=" + getPort());
}
}


     新建一个controller用来浏览器访问,这里主要用来查看redis的详细配置信息

   

package com.spring.boot.disconf.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.spring.boot.disconf.config.JedisConfig;

@RestController
@RequestMapping("/disconf/redis")
public class DisconfRedisController {

@Autowired
private JedisConfig jedisConfig;

@RequestMapping("/getNewData")
public String getNewDdata() {
String host = jedisConfig.getHost();
int prot = jedisConfig.getPort();
return host+";"+prot;
}
}


     springboot项目启动类:

   

package com.spring.boot.disconf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;

@SpringBootApplication
@ImportResource({"classpath:disconf.xml"})
public class DisconfSpringBootApplication {

/**
* @param args
*/
public static void main(String[] args) {
SpringApplication.run(DisconfSpringBootApplication.class, args);
}

}

    启动springboot项目后,在控制台会打印很多信息,比如zk连接,redis信息等,现在我们来访问controller

    第一次访问:

   
springboot集成disconf实现配置文件实时刷新
    在disconf-web管理端修改配置信息

   
springboot集成disconf实现配置文件实时刷新
    点击上传后,查看disconf的数据库Config表

   
springboot集成disconf实现配置文件实时刷新
 

    发现redis的port已经被我改成了6380,现在我们再来访问一次

  
springboot集成disconf实现配置文件实时刷新
    发现配置文件更新后应用已经监听到并实时刷新了。