前置环境需要的配置:
disconf环境搭建:https://blog.csdn.net/qq_37598011/article/details/93619525
SpringBoot与Disconf整合
pom文件
这里我用的是SpringBoot2.0
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baidu.disconf</groupId>
<artifactId>disconf-client</artifactId>
<version>2.6.36</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
配置
这里需要在resource目录下新建一个名为 disconf.properties 配置文件
# 是否使用远程配置文件
#true(默认)会从远程获取配置 false则直接获取本地配置
enable.remote.conf=true
# disconf HOST地址
conf_server_host=192.168.75.128:8085
# App name
app=springboot-demo
# version
version=V1_0_0
# env
env=local
#获取远程配置 重试次数,默认是3次
conf_server_url_retry_times=1
#获取远程配置 试时休眠时间,默认是5秒
conf_server_url_retry_sleep_seconds=1
# 下載檔案的目錄
user_define_download_dir=./disconf/download
#忽略哪些分布式配置,用逗号分隔
#ignore=
这块的host地址请根据你的实际情况进行修改。
application.properties内容如下
test.username=useradmin
test.password=passward
test.properties内容如下
aaa=bbbbb
配置类
package com.example.demo.config;
import com.baidu.disconf.client.DisconfMgrBean;
import com.baidu.disconf.client.DisconfMgrBeanSecond;
import com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@Configuration
public class DisconfConfiguration {
@Bean(destroyMethod = "destroy")
public DisconfMgrBean getDisconfMgrBean() {
DisconfMgrBean disconfMgrBean = new DisconfMgrBean();
//你的需要被扫描的包
disconfMgrBean.setScanPackage("com.example.demo");
return disconfMgrBean;
}
@Bean(destroyMethod = "destroy", initMethod = "init")
public DisconfMgrBeanSecond getDisconfMgrBean2() {
return new DisconfMgrBeanSecond();
}
@Bean(name = "reloadablePropertiesFactoryBean")
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
public ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean() {
ReloadablePropertiesFactoryBean propertiesFactoryBean = new ReloadablePropertiesFactoryBean();
propertiesFactoryBean.setSingleton(true);
// disconf配置的文件
List<String> fileNames = new ArrayList<>();
fileNames.add("classpath:application.properties");
fileNames.add("classpath:test.properties");
propertiesFactoryBean.setLocations(fileNames);
return propertiesFactoryBean;
}
@Bean(name = "propertyPlaceholderConfigurer")
public PropertyPlaceholderConfigurer propertyPlaceholderConfigurer(ReloadablePropertiesFactoryBean reloadablePropertiesFactoryBean) {
PropertyPlaceholderConfigurer placeholderConfigurer = new PropertyPlaceholderConfigurer();
placeholderConfigurer.setIgnoreResourceNotFound(true);
placeholderConfigurer.setIgnoreUnresolvablePlaceholders(true);
try {
Properties properties = reloadablePropertiesFactoryBean.getObject();
placeholderConfigurer.setProperties(properties);
} catch (IOException e) {
throw new RuntimeException("unable to find properties", e);
}
return placeholderConfigurer;
}
}
下面创建一个需要被disconf所管理的配置类
package com.example.demo.config.disconf;
import com.baidu.disconf.client.common.annotations.DisconfFile;
import com.baidu.disconf.client.common.annotations.DisconfFileItem;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
@DisconfFile(filename = "application.properties")
public class TestConfig {
public String username;
public String password;
@Override
public String toString() {
return "TestConfig{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@DisconfFileItem(name = "test.username")
public String getUsername() {
return username;
}
@DisconfFileItem(name = "test.password")
public String getPassword() {
return this.password;
}
}
如果想要在配置修改后能做某些特特殊事件(如连接信息修改)的话,需要新加一个回调类
package com.example.demo.callback;
import com.baidu.disconf.client.common.annotations.DisconfUpdateService;
import com.baidu.disconf.client.common.update.IDisconfUpdate;
import com.example.demo.config.disconf.TestConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@DisconfUpdateService(classes = {TestConfig.class})
public class SimpleTestServiceUpdateCallback implements IDisconfUpdate {
@Autowired
TestConfig testConfig;
@Override
public void reload() throws Exception {
System.out.println(testConfig);
}
}
OK~下面添加一个控制器用来观察是否能在配置修改后实时刷新
package com.example.demo.controller;
import com.example.demo.config.disconf.TestConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
TestConfig testConfig;
@RequestMapping(name="test")
public String test() {
return testConfig.toString();
}
}
我的目录结构如下
启动后可以看到获取到的配置信息
并且在disconf-web控制台也能看到实例信息
到disconf-web上修改实例
可以看到控制台打印了最新修改的信息说明配置修改成功。
再次调用http://localhost:8080/test
Ok完美!!!
除了通过继承单独实现IDisconfUpdate接口外它本身还可以在自身上实现,如:
package com.example.demo.config.disconf;
import com.baidu.disconf.client.common.annotations.DisconfFile;
import com.baidu.disconf.client.common.annotations.DisconfFileItem;
import com.baidu.disconf.client.common.annotations.DisconfUpdateService;
import com.baidu.disconf.client.common.update.IDisconfUpdate;
import lombok.Data;
import org.springframework.stereotype.Component;
@Data
@Component
@DisconfFile(filename = "application.properties")
@DisconfUpdateService(classes = {TestConfig.class})//更新后回调
public class TestConfig implements IDisconfUpdate {
public String username;
public String password;
@Override
public String toString() {
return "TestConfig{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
@DisconfFileItem(name = "test.username")
public String getUsername() {
return username;
}
@DisconfFileItem(name = "test.password")
public String getPassword() {
return this.password;
}
@Override
public void reload() throws Exception {
System.out.println("更新后:"+this.toString());
}
}
参考:https://disconf.readthedocs.io/zh_CN/latest/tutorial-client/index.html