一、概述
  在一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理成千上百个服务实例的配置问题。王阿晶提出了基于zooKeeper的配置信息存储方案的设计与实现, 它将所有配置存储在zookeeper上,这会导致配置的管理不那么方便,而且他们没有相关的源码实现。淘宝的diamond是淘宝内部使用的一个管理持久配置的系统,它具有完整的开源源码实现,它的特点是简单、可靠、易用,淘宝内部绝大多数系统的配置都采用diamond来进行统一管理。他将所有配置文件里的配置打散化进行存储,只支持KV结构,并且配置更新的推送是非实时的。百度内部的BJF配置中心服务采用了类似淘宝diamond的实现,也是配置打散化、只支持KV和非实时推送。Disconf的出现,就是为了解决这些问题。
  二、Disconf web的安装
  Disconf web是Disconf的管理界面及服务器,通过它来配置管理我们的配置文件,具体的安装步骤在此不再详述,自行百度或者可参考https://my.oschina.net/gengkangkang/blog/1593017。
  
   
  三、创建服务
   创建项目普通的SpringBoot项目config-disconf,在pom.xml文件中增加如下依赖
  <dependencies>    <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter</artifactId>    </dependency>    <dependency>       <groupId>com.baidu.disconf</groupId>       <artifactId>disconf-client</artifactId>       <version>2.6.36</version>    </dependency>    <dependency>       <groupId>org.springframework.boot</groupId>       <artifactId>spring-boot-starter-test</artifactId>       <scope>test</scope>    </dependency> </dependencies>
  创建spring-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-3.1.xsd         http://www.springframework.org/schema/aop         http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">      <aop:aspectj-autoproxy proxy-target-class="true"/>      <!-- 使用disconf必须添加以下配置 -->     <bean id="disconfMgrBean" class="com.baidu.disconf.client.DisconfMgrBean"           destroy-method="destroy">         <property name="scanPackage" value="com.gkk.configdisconf"/>     </bean>     <bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"           init-method="init" destroy-method="destroy">     </bean>         <!-- 需要托管的配置文件 -->    <bean id="configproperties_no_reloadable_disconf"       class="com.baidu.disconf.client.addons.properties.ReloadablePropertiesFactoryBean">       <property name="locations">          <list>               <value>application.properties</value>               <value>disconf.properties</value>          </list>       </property>     </bean>  </beans>
  新增disconf配置文件disconf.properties
  # 是否使用远程配置文件 # true(默认)会从远程获取配置 false则直接获取本地配置 disconf.enable.remote.conf=true  # # 配置服务器的 HOST,用逗号分隔  127.0.0.1:8000,127.0.0.1:8000 # disconf.conf_server_host=10.17.5.45:8081  # 版本, 请采用 X_X_X_X 格式 disconf.version=1_0_0_0  # APP 请采用 产品线_服务名 格式 disconf.app=config_disconf  # 环境 disconf.env=rd  # 忽略哪些分布式配置,用逗号分隔 disconf.ignore=  # 获取远程配置 重试次数,默认是3次 disconf.conf_server_url_retry_times=1 # 获取远程配置 重试时休眠时间,默认是5秒 disconf.conf_server_url_retry_sleep_seconds=1  # 自定义的下载路径 disconf.user_define_download_dir=config  #disconf.enable_local_download_dir_in_class_path=false
  在ConfigDisconfApplication上导入依赖文件
  @ImportResource({"classpath:conf/spring-disconf.xml"}) @SpringBootApplication public class ConfigDisconfApplication {     public static void main(String[] args) {       SpringApplication.run(ConfigDisconfApplication.class, args);    } }   
  新建参数类PayPara
  package com.gkk.configdisconf.config; import com.baidu.disconf.client.common.update.IDisconfUpdate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import com.baidu.disconf.client.common.annotations.DisconfFile; import com.baidu.disconf.client.common.annotations.DisconfFileItem; import com.baidu.disconf.client.common.annotations.DisconfUpdateService;  /**  * @Author:gkk  * @Remark  * @Date: Created in 2017/12/21 11:29  */ @Service @DisconfFile(filename = "pay_para.properties") @DisconfUpdateService(classes = { PayPara.class }) public class PayPara implements IDisconfUpdate {     private Logger logger= LoggerFactory.getLogger(getClass());       private String flag;     private String url;      @DisconfFileItem(name = "flag",associateField="flag")     public String getFlag() {         return flag;     }      public void setFlag(String flag) {         this.flag = flag;     }      @DisconfFileItem(name = "url",associateField="url")     public String getUrl() {         return url;     }      public void setUrl(String url) {         this.url = url;     }      @Override     public String toString() {         return "PayPara{" +                 "flag='" + flag + '\'' +                 ", url='" + url + '\'' +                 '}';     }      @Override     public void reload() throws Exception {         logger.info("配置文件更新了!更新为:[{}]",this.toString());     } }  至此,client端已经配置完毕,剩下的去服务端新建配置
  新建配置APP
  
  新建配置文件pay_para.properties
  
  启动应用,可以看到配置生效了
  
  接下来,我们修改配置文件,看看是否实时推送配置更新
  
  
  四、小结
      disconf对于分布式系统非常有用,更新配置文件只需要去控制台更新,它就会自动推送到每台服务器,利用好监控配置功能做一些db、redis等实例的刷新。
     码云地址:https://gitee.com/gengkangkang/springcloud.git
      github地址:https://github.com/gengkangkang/springcloud.git
  