博客
关于我
Disconf配SpringBoot实战(自动刷新无需重启)
阅读量:554 次
发布时间:2019-03-09

本文共 7566 字,大约阅读时间需要 25 分钟。

前置环境需要的配置:

disconf环境搭建:

SpringBoot与Disconf整合

pom文件

这里我用的是SpringBoot2.0

4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
com.example
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
1.8
org.projectlombok
lombok
1.18.0
provided
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
com.baidu.disconf
disconf-client
2.6.36
org.springframework.boot
spring-boot-maven-plugin

配置

这里需要在resource目录下新建一个名为 disconf.properties 配置文件

# 是否使用远程配置文件#true(默认)会从远程获取配置 false则直接获取本地配置enable.remote.conf=true# disconf HOST地址conf_server_host=192.168.75.128:8085# App nameapp=springboot-demo# versionversion=V1_0_0# envenv=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=useradmintest.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;@Configurationpublic 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
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;@RestControllerpublic class TestController {    @Autowired    TestConfig testConfig;    @RequestMapping(name="test")    public String test() {        return testConfig.toString();    }}

我的目录结构如下

启动后可以看到获取到的配置信息

并且在disconf-web控制台也能看到实例信息 

调用

到disconf-web上修改实例

可以看到控制台打印了最新修改的信息说明配置修改成功。

再次调用

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());    }}

 

参考:

 

转载地址:http://jgmsz.baihongyu.com/

你可能感兴趣的文章
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>
mysql CONCAT()函数拼接有NULL
查看>>
multiprocessing.Manager 嵌套共享对象不适用于队列
查看>>
multiprocessing.pool.map 和带有两个参数的函数
查看>>
MYSQL CONCAT函数
查看>>
multiprocessing.Pool:map_async 和 imap 有什么区别?
查看>>
MySQL Connector/Net 句柄泄露
查看>>
multiprocessor(中)
查看>>
mysql CPU使用率过高的一次处理经历
查看>>
Multisim中555定时器使用技巧
查看>>