一、介绍
disconf包含客户端disconf-Client和 管理端disconf-Web两个模块,客户端disconf-Client需要引入到项目中,disconf-Web单独部署用于配置中心可视化页面
1.为什么选用配置中心?
如果没有配置中心,每次修改配置文件只能手动修改,然后再将每个项目重启重
启,若服务器多,则效率低速度慢,容易出错。
2.配置中心需要考虑的内容?
1)基于ZK+DB实现
2)修改配置文件要实时生效
3)只需加载被修改的配置文件
4)考虑系统容灾,保证高可用
5)具备权限管理
6)可以根据不同环境配置多套配置
7)需要配置多种配置方式,比如key-value型,properties文件型
二、原理
1.流程
1)通过firstScan加载系统配置和用户配置,进行包扫描,然后获取数据
2)注册DisconfAspectJ
3)bean属性注入
1.如何做到实时修改?
依靠zookeeper的watch机制。ZK是通过目录挂载的方式来做服务的自动注册与发布。客户端启动时注册了一个回调接口,当ZK目录发生变化(web内容修改)时会回调所有客户端节点,从而做到实时更新客户端配置的目的
2.如何做到数据持久化?
添加的配置数据均被持久化到DB中,每次客户端启动时都会调用disconf的http接口获取最新的配置数据,如果网络不通,默认重试三次,每次持续5秒
3.如果第一次加载配置成功后,配置中心不可用,会造成影响吗?
不会,配置中心数据已经被加载到项目的内存中了
4.如果配置中心宕机,项目重启会造成影响吗?
不会,第一次从配置中心拉取数据后会持久化到磁盘中,配置中心不可用会读取缓存文件的数据
即:Disconf是具有兼容性的
当开启Disconf时:
如果Disconf正常运行,则正常使用分布式配置。
如果Disconf非正常运行,则使用本地配置。(Disconf可以保证在Disconf失败时,原有程序能够按原有逻辑正确运行)
当不开启Disconf时: 则使用本地配置。
只要是运行一次分布式程序成功,则本地就含有最全的配置文件。此时,如果再运行一次分布式程序,如果出现失败,则上一次下载成功的配置文件就会当成本地配置生效,程序成功启动。
5.怎么保证所有项目的节点都修改配置文件成功?
无法保证,但项目连接到配置中心会将机器名挂载到ZK目录下,可以在disconf-web页面查询配置使用的机器数
三、使用
1.pom文件
<dependency>
<groupId>com.baidu.disconf</groupId>
<artifactId>disconf-client</artifactId>
<version>2.6.31</version>
</dependency>
2.创建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:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd">
<!-- <context:component-scan base-package="com.ddky"/> -->
<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.ddky"/>
</bean>
<bean id="disconfMgrBean2" class="com.baidu.disconf.client.DisconfMgrBeanSecond"
init-method="init" destroy-method="destroy">
</bean>
</beans>
3.创建disconf.properties文件
# 是否使用远程配置文件
# true(默认)会从远程获取配置 false则直接获取本地配置
enable.remote.conf=true
#
# 配置服务器的 HOST,用逗号分隔 127.0.0.1:8000,127.0.0.1:8000
#
conf_server_host=192.168.86.45
# 版本, 请采用 X_X_X_X 格式
version=1_0_0_0
# APP 请采用 产品线_服务名 格式
app=user_web
# 环境
env=rd
# debug
debug=false
# 忽略哪些分布式配置,用逗号分隔
ignore=
# 获取远程配置 重试次数,默认是3次
conf_server_url_retry_times=3
# 获取远程配置 重试时休眠时间,默认是5秒
conf_server_url_retry_sleep_seconds=5
4.将disconf.xml import到applicationContext.xml或springmvc-servlet.xml中
<import resource="disconf.xml" />
5.添加配置java类,如 SwitchConfig.java 对应ddky-user-web的user.properties,代码如下
@Service
@Scope("singleton")
@DisconfFile(filename = "user.properties")
public class SwitchConfig {
// 叮当币开关 on开 off关闭
private static String switches;
// 叮当币商城开关 on开 off关闭
private static String dingdangbi;
// 领取赠品 on开 off关
private static String duihuan;
// 多购物车开关 1开启 0关闭
private static String multipleShopSupport;
// app分类商城切换开关 on分类 off商城
private static String classification;
@DisconfFileItem(name = "duihuan")
public String getDuihuan() {
return duihuan;
}
public void setDuihuan(String duihuan) {
this.duihuan = duihuan;
}
@DisconfFileItem(name = "classification", associateField = "classification")
public String getClassification() {
return classification;
}
public void setClassification(String classification) {
this.classification = classification;
}
@DisconfFileItem(name = "switches", associateField = "switches")
public String getSwitches() {
return switches;
}
public void setSwitches(String switches) {
this.switches = switches;
}
@DisconfFileItem(name = "dingdangbi", associateField = "dingdangbi")
public String getDingdangbi() {
return dingdangbi;
}
public void setDingdangbi(String dingdangbi) {
this.dingdangbi = dingdangbi;
}
@DisconfFileItem(name = "multipleShopSupport", associateField = "multipleShopSupport")
public String getMultipleShopSupport() {
return multipleShopSupport;
}
public void setMultipleShopSupport(String multipleShopSupport) {
this.multipleShopSupport = multipleShopSupport;
}
}
若需要配置更改后回调,则需要实现 IDisconfUpdate
@Service
@Scope("singleton")
@DisconfFile(filename = "user.properties")
@DisconfUpdateService(classes = {SwitchConfig.class})
public class SwitchConfig implements IDisconfUpdate {
// 叮当币开关 on开 off关闭
private static String switches;
// 叮当币商城开关 on开 off关闭
private static String dingdangbi;
// 领取赠品 on开 off关
private static String duihuan;
// 多购物车开关 1开启 0关闭
private static String multipleShopSupport;
// app分类商城切换开关 on分类 off商城
private static String classification;
@DisconfFileItem(name = "duihuan")
public String getDuihuan() {
return duihuan;
}
public void setDuihuan(String duihuan) {
this.duihuan = duihuan;
}
@DisconfFileItem(name = "classification", associateField = "classification")
public String getClassification() {
return classification;
}
public void setClassification(String classification) {
this.classification = classification;
}
@DisconfFileItem(name = "switches", associateField = "switches")
public String getSwitches() {
return switches;
}
public void setSwitches(String switches) {
this.switches = switches;
}
@DisconfFileItem(name = "dingdangbi", associateField = "dingdangbi")
public String getDingdangbi() {
return dingdangbi;
}
public void setDingdangbi(String dingdangbi) {
this.dingdangbi = dingdangbi;
}
@DisconfFileItem(name = "multipleShopSupport", associateField = "multipleShopSupport")
public String getMultipleShopSupport() {
return multipleShopSupport;
}
public void setMultipleShopSupport(String multipleShopSupport) {
this.multipleShopSupport = multipleShopSupport;
}
@Override
public void reload() throws Exception {
// TODO Auto-generated method stub
System.out.println("回调方法");
}
}
四、文章
1.https://blog.csdn.net/weixin_30514745/article/details/97543402?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.edu_weight
2.https://www.jianshu.com/p/131c56f2a934
3.disconf官方文档