ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Disconf配SpringBoot实战(自动刷新无需重启)

2019-06-26 17:50:25  阅读:744  来源: 互联网

标签:实战 SpringBoot disconf springframework Disconf org import com public


前置环境需要的配置:

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.config.disconf");
        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控制台也能看到实例信息 

调用http://localhost:8080/test

到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

 

标签:实战,SpringBoot,disconf,springframework,Disconf,org,import,com,public
来源: https://blog.csdn.net/qq_37598011/article/details/93745803

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有