开源配置中心xxl-conf的核心原理分析
XXL-CONF是一款轻量级的开源配置中心项目,由国内大牛许雪里开发.下面是官方对其优点作出的描述:
一个轻量级分布式配置管理平台,拥有"轻量级、秒级动态推送、多环境、跨语言、跨机房、配置监听、权限控制、版本回滚"等特性。现已开放源代码,开箱即用。
开源项目地址:
鄙人有幸拜读了大神的源码,分享一下自己的理解:
项目分为配置中心服务端和客户端两个部分.
客户端与服务端通过http接口进行通信.
服务端为客户端提供了两个http接口:
一个查询配置的接口,一个监控配置是否发生变更的接口.
查询配置的接口,只会从本地磁盘快照中获取配置,不会查询数据库.
监控接口返回的是一个DeferredResult对象,它是SpringMVC提供的一种技术,
可以实现服务器端向客户端推送数据,不过调用该接口时,配置中心并不会直接给客户端返回数据,
而是先将客户端请求和对应的DeferredResult对象缓存起来.
配置中心在启动时,会创建一个线程池,并启动两个线程:
其中一个线程用来监控配置是否发生变更,具体是查询数据库中的一张表,
该表只记录最近刚发生变化的数据,为保证实时性,线程会每隔1秒就查询一次该表,
如果该表中有数据,就说明配置有变化,就立即更新本地快照,并广播给所有客户端;
另一个线程用于从数据库加载全量数据,考虑到数据量可能比较大,
线程会间隔30秒查询一次数据库.如果数据有变化,就立即更新本地快照并广播给所有客户端.
配置中心广播机制:
配置中心的广播机制是利用了SpringMCU提供的DeferredResult对象特性实现的.
配置发生变更,配置中心不会直接将变更的数据推送给客户端,而是告诉客户端数据有变化,
需要客户端主动发起http请求调用配置中心的查询接口获取最新的配置.
DeferredResult对象默认的超时时间是30秒,如果配置没有发生变化,则等待超时返回.
客户端在启动的时候:
首先会创建一个本地缓存用于保存配置数据,刚创建时本地缓存是空的.
然后会启动一个守护线程,每隔3秒钟查看一下本地缓存是否有数据,线程会在此阻塞.
同时客户端会去解析所有加了@XxlConf注解的字段或使用$XxlConf{}占位符配置,拿到key,
向配置中心发送http请求查询数据,先将查询到的数据放入本地缓存,然后再给这些字段赋值. 当客户端本地缓存中有数据的时候,会被守护线程扫描到,
会向配置中心发送http请求查询自己需要的配置信息,查询到配置后,
它会先比对一下配置中心的配置项和本地缓存中配置项是否相同,
如果相同就直接忽略不处理,如果不相同,说明有变化,
如果本地缓存仓库中没有该key,或该key的值为空,或该key的值有变化,
则更新本地缓存;最后将缓存中的配置同步到镜像文件.
客户会通过守护线程与服务端保持长连接:
客户端会循环调用配置中心的监控接口,
如果配置中心数据有变化,会立刻通知客户端,
客户端接收到通知会立刻调用配置中心的查询接口获取数据;
如果配置中心的数据没有变更,则默认30秒后再调用查询接口;
客户端和配置中心的快照文件:
客户端和配置中心都有使用快照文件来保证数据的安全性,
快照文件都是一些properties文件,考虑到value的值可能比较大,
为了提高检索效率,每一个配置项用一个单独的文件来保存.
文件名由环境+项目名+key组成,这样做便于查询的时候能够快速精准定位. 配置中心的快照文件是在配置中心启动30秒左右被创建,
前面提到过配置中启动的时候会启动一个线程,负责每隔30秒,
会从数据库加载全量的配置数据,更新到快照文件.
如果某个配置项有变更就覆盖其对应的快照文件,
配置中心第一次启动的时候,快照文件是不存在的,
快照文件不存在的话,会直接被创建. 客户端的快照文件由客户端启动后开启的那个守护线程创建.
守护线程会循环调用配置中心的监控接口,
每隔30秒拉取一次配置,更新到快照文件.
注意:
如果配置中心增加了新的配置,客户端是不会收到通知的,
因为客户端每次请求接口只拉取自己所使用到的配置,
自己所使用到的配置,是在客户端启动的时候通过扫描
@XxlConf注解和$XxlConf{}占位符时就已经确定了的.
开源配置中心xxl-conf的核心原理分析的更多相关文章
- 【Alpaca】.Net版开源配置中心 - 技术选型 Vue 3.0
是否可以用 Vue 3.0 现有的Vue 2.* 不推荐,坐等Vue 3.0出迁移工具吧,手动改的话工作量还是不小的 新项目 考虑下团队内对Vue + TS + VS Code的熟练程度.过程中你会遇 ...
- Java Reference核心原理分析
本文转载自Java Reference核心原理分析 导语 带着问题,看源码针对性会更强一点.印象会更深刻.并且效果也会更好.所以我先卖个关子,提两个问题(没准下次跳槽时就被问到). 我们可以用Byte ...
- Nacos - 阿里开源配置中心
配置中心相信大家都有听过,zookeeper.apollo等等都是配置中心的代表,但大部分都是JAVA系为主的,笔者主要开发语言使用的是Golang当然也有类似于ETCD这样的组件,但是并不方便管理也 ...
- Spring核心原理分析之MVC九大组件(1)
本文节选自<Spring 5核心原理> 1 什么是Spring MVC Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 S ...
- springAop:Aop(Xml)配置,Aop注解配置,spring_Aop综合案例,Aop底层原理分析
知识点梳理 课堂讲义 0)回顾Spring体系结构 Spring的两个核心:IoC和AOP 1)AOP简介 1.1)OOP开发思路 OOP规定程序开发以类为模型,一切围绕对象进行,OOP中完成某个任务 ...
- Redis cluster的核心原理分析
一.节点间的内部通信机制 1.基础通信原理 (1)redis cluster节点间采取gossip协议进行通信 跟集中式不同,不是将集群元数据(节点信息,故障,等等)集中存储在某个节点上,而是互相之间 ...
- 【转】Locust-工具核心原理分析
Locust工具在市场上不如Loadrunner / JMeter流行,使用的范围也没有那么广,但不可否认其是一款很不错的工具.我个人觉得Locust使用不是那么广泛,主要是因为一下方式: Locus ...
- zookeeper配置中心实战--solrcloud zookeeper配置中心原理及源码分析
程序的发展,需要引入集中配置: 随着程序功能的日益复杂,程序的配置日益增多:各种功能的开关.参数的配置.服务器的地址…… 并且对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境.分集群管理配 ...
- .NET Core微服务之基于Apollo实现统一配置中心
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.关于统一配置中心与Apollo 在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改 ...
随机推荐
- /bin/false和/sbin/nologin的区别
/bin/false是最严格的禁止login选项,一切服务都不能用./sbin/nologin只是不允许login系统 其中树莓派的/sbin/nologin文件在/usr/sbin/nologin小 ...
- UVA816 Abbott's Revenge (三元组BFS)
题目描述: 输入输出: 输入样例: SAMPLE 3 1 N 3 3 1 1 WL NR * 1 2 WLF NR ER * 1 3 NL ER * 2 1 SL WR NF * 2 2 SL WF ...
- No.1.测试Synchronized加锁String字符串后的多线程同步状况
测试目的描述 Synchronized关键字锁定String字符串可能会带来严重的后果, 尽量不要使用 synchronized(String a) 因为JVM中,因为字符串常量池具有缓冲功能! 接下 ...
- IT公司该如何落实机器学习?
Cisco发布的总结报告<泽字节时代:趋势和分析>中指出:2016年末,全球年度互联网流量将突破ZB大关(1ZB泽字节:1000EB艾字节),并将于2020年达到2.3ZB;互联网的流量将 ...
- 如何解决redis的并发竞争问题?
这个也是线上非常常见的一个问题,就是多客户端同时并发写一个key,可能本来应该先到的数据后到了,导致数据版本错了.或者是多客户端同时获取一个key,修改值之后再写回去,只要顺序错了,数据就错了. 而且 ...
- 扫雷小游戏PyQt5开发【附源代码】
也没啥可介绍哒,扫雷大家都玩过. 雷的分布算法也很简单,就是在雷地图(map:二维数组)中,随机放雷,然后这个雷的8个方位(上下左右.四个对角)的数字(非雷的标记.加一后不为雷的标记)都加一. 如何判 ...
- LG4718 【模板】Pollard-Rho算法 和 [Cqoi2016]密钥破解
Pollard-Rho算法 总结了各种卡常技巧的代码: #define int long long typedef __int128 LL; IN int fpow(int a,int b,int m ...
- 直接获取任意对象的 $('.xx').css('x') 值都是0
<!-- 任意对象,直接获取他们的 x , y 都是为0: $('#xxx').css('x','y'); --> <!DOCTYPE html> <html lang= ...
- cube.js 学习(五)cube.js joins 说明
cube.js 也支持join, 参考格式 joins: { TargetCubeName: { relationship: `belongsTo` || `hasMany` || `hasOne ...
- 表述数据的手段——json
一.JSON 语法规则 在 JS 语言中,一切都是对象.因此,任何支持的类型都可以通过 JSON 来表示,例如字符串.数字.对象.数组等.但是对象和数组是比较特殊且常用的两种类型: 对象表示为键值对 ...