一、disconf介绍
disconf是百度的一个分布式配置中心,由于我们项目配置文件较多,都是properties文件,虽然也支持实时生效,但是没有一个可视化的WEB端用来管理(每次修改配置文件需要提上线流程上线修改),目前采用disconf来实现。
二、springboot集成disconf
本篇只是一个入门,因为还在调研阶段,本篇采用注解方式实现,因为注解实现的可以实时生效而xml的方式需要自己reload到bean里面。
首先在disconf-web管理后端建一个app和对应的配置文件(这里以监听redis.properties为例)
在新建的一个app叫做myApp下新建配置文件:
建好后:
来看应用:
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
第一次访问:
在disconf-web管理端修改配置信息
点击上传后,查看disconf的数据库Config表
发现redis的port已经被我改成了6380,现在我们再来访问一次
发现配置文件更新后应用已经监听到并实时刷新了。