disconf分布式配置中心

本文介绍了disconf分布式配置中心,包括其组成部分——客户端disconf-Client和管理端disconf-Web,以及它们的功能。disconf-Client作为项目的一部分,负责与disconf-Web交互,实现配置的集中管理和可视化操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、介绍
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官方文档
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值