xxl-conf配置中心

简介: ### 一、实现一个轻量级简单的配置中心,同时不考虑使用zk?1.由于我们使用的配置中心需要兼容多套环境,因此需要多环境2.需要有权限控制3.需要对配置的信息,能够实时响应4.如果配置信息存储在数据库,为了减轻数据库的压力,可以进行持久化到磁盘文件中当时这里会有一个问题需要考虑,如果持久化到磁盘,需要考虑如果配置发生了改变,需要能够实时同步到磁盘文件中,因此此时需要考虑一个线程进行实时同步。5.对应配置信息发生增、删、改,能够实时更新和修改

一、实现一个轻量级简单的配置中心,同时不考虑使用zk?

1.由于我们使用的配置中心需要兼容多套环境,因此需要多环境

2.需要有权限控制

3.需要对配置的信息,能够实时响应

4.如果配置信息存储在数据库,为了减轻数据库的压力,可以进行持久化到磁盘文件中

当时这里会有一个问题需要考虑,如果持久化到磁盘,需要考虑如果配置发生了改变,需要能够实时同步到磁盘文件中,因此此时需要考虑一个线程进行实时同步。

5.对应配置信息发生增、删、改,能够实时更新和修改

二、xxl-conf的官方架构图


image-20230124004652800.png

image-20230124005119740.png


从图中,我们可以看到配置中心如果执行了配置操作,此时会做一个写的操作到文件,其会做一个广播、同步的操作,同步镜像文件,执行配置的刷新操作。在调用的时候,能够实时拉取到最新的配置信息。这里做了两个持久化,一个是持久化到了数据库,一个是持久化到文件。在之前的版本,xxl-conf使用过zookeeper作为存储配置的作为配置中心。

三、xxl-conf的使用

一个是服务端,一个是客户端。服务端提供了一个可视化的界面,我们可以在可视化界面中,执行配置信息的增、删、查、改。同时接入的业务系统需要引入xxl-conf-core。

服务端,我们可以看到配置管理中的key-value的对应信息,同时描述信息。

image-20230124005457822.png


客户端:引入xxl-conf-core的依赖即可。

配置配置信息:

xxl.conf.admin.address=http://localhost:8080/

xxl.conf.env=test

xxl.conf.access.token=

xxl.conf.mirrorfile=/data/applogs/xxl-conf/xxl-conf-mirror-sample.properties

可以看到主要是服务端的请求地址、对应的配置环境、token、镜像文件存放的路径。

如果配置成功后,可以运行接入的业务系统的例子,可以看到文件路径中会有启动的服务端和业务系统的日志信息,同时还有配置文件的配置信息

image-20230124011428838.png

可以看到配置配置数据信息在信息配置后,持久化到了磁盘文件中。

image-20230124010142278.png

此时可以看到运行获取配置的效果:

image-20230124011538457.png

可以看到获取到了对应的key和value的值。

四、表结构

image-20230124012249721.png

       可以看到xxl-conf中有三张表是值得我们关注的,一张是xxl_conf_node,一张是xxl_conf_node_msg。从ConfController的增、删、改种可以看到,在做配置信息的变更后,同时会sendConfMsg的动作,此时xxl_conf_node_msg中会存在数据。另外一张表是一张审计日志表,方便查看谁对配置做了修改。

       xxl_conf_env是对应环境的信息。xxl_conf_user是用户信息。xxl_conf_project是对应的项目的名称信息。

五、原理

在启动服务端的时候,由于XxlConfNodeServiceImpl实现了InitializingBean, DisposableBean接口,因此会做线程启动。

image-20230124013331808.png

可以看到主要的代码:

   查配置消息表信息

  遍历配置消息,进行文件同步

  同步完成后,执行老配置消息清理

// new message, filter readed

List<XxlConfNodeMsg>messageList=xxlConfNodeMsgDao.findMsg(readedMessageIds);

if (messageList!=null&&messageList.size()>0) {

  for (XxlConfNodeMsgmessage: messageList) {

       readedMessageIds.add(message.getId());

       // sync file 同步文件

       setFileConfData(message.getEnv(), message.getKey(), message.getValue());

     }

   }

       // clean old message; 清理老消息

       if ( (System.currentTimeMillis()/1000) %confBeatTime==0) {

           xxlConfNodeMsgDao.cleanMessage(confBeatTime);

           readedMessageIds.clear();

}

找到记录消息的xxl_conf_node_msg,如果存在,则需要做文件同步处理,同时清理调老的消息。

启动客户端,可以看到会做初始化操作:

        三个初始化,初始化完成后,做监听操作。首先对远程的配置信息进行初始化,然后初始化镜像文件,初始化缓存信息和线程,循环刷新和监控。完成后监听所有的key发生改变的时候,做刷新操作。

/**

    * init 初始化

    *

    * @param adminAddress

    * @param env

    */

   publicstaticvoidinit(StringadminAddress, Stringenv, StringaccessToken, Stringmirrorfile) {

       // init

       // init remote util 初始化远程配置

       XxlConfRemoteConf.init(adminAddress, env, accessToken);

       // init mirror util

       XxlConfMirrorConf.init(mirrorfile);

       // init cache + thread, cycle refresh + monitor

       XxlConfLocalCacheConf.init();

       // listener all key change

       XxlConfListenerFactory.addListener(null, newBeanRefreshXxlConfListener());

   }

此时也会启动线程操作:

   只不过此时获取的所有的配置信息

//获取所有配置的节点列表,这里是拿到所有信息的关键方法

List<XxlConfNode>confNodeList=xxlConfNodeDao.pageList(offset, pagesize, null, null, null);

   while (confNodeList!=null&&confNodeList.size()>0) {

    for (XxlConfNodeconfNoteItem: confNodeList) {

       // sync file 同步文件

       StringconfDataFile=setFileConfData(confNoteItem.getEnv(), confNoteItem.getKey(), confNoteItem.getValue());

       // collect confDataFile

       confDataFileList.add(confDataFile);

    }

   offset+=1000;

   confNodeList=xxlConfNodeDao.pageList(offset, pagesize, null, null, null);

   }

   // clean old registry-data file 清理老的配置文件

   cleanFileConfData(confDataFileList);

获取节点配置信息,如果不为空,则同步对应节点的配置信息,然后清理老的配置文件。这里做了1个1000以上,做多次查询。

然后可以看到变更执行的监听:

XxlConfClient.addListener("default.key01", (key, value) ->logger.info("配置变更事件通知:{}={}", key, value));

总体来说,xxl-conf的作者比较贴心,很容易上手xxl-conf。


目录
相关文章
|
Java fastjson API
Springboot 整合 xxljob 动态API调度任务(进阶篇)
Springboot 整合 xxljob 动态API调度任务(进阶篇)
9138 0
Springboot 整合 xxljob 动态API调度任务(进阶篇)
|
存储 Java BI
XXL-JOB定时任务知识点和应用实例
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。该处只是介绍xxl_job的一下基础知识和使用的实例,具体的安装调试请参照对应的最新的官方文档,中文开源地址:https://www.xuxueli.com/xxl-job
5271 0
|
负载均衡 数据库连接 Linux
confluence与jira部署详解
confluence与jira部署详解
confluence与jira部署详解
|
敏捷开发 Java PHP
|
6月前
|
人工智能 自然语言处理 Java
Java做AI真不行?2026年最被低估的机会来了
Spring官宣集成DeepSeek,Java正式迈入AI驱动时代!2026年AI岗位缺口巨大,大厂招聘普遍要求大模型能力。Java团队借力Spring生态与JBoltAI等国产框架,可低门槛接入代码生成、RAG、Agent等全链路AI能力,实现差异化突围。(239字)
532 3
|
6月前
|
人工智能 前端开发 算法
拆解Agentic RAG:从零代码构建到ReAct推理链
传统RAG仅被动检索一次即生成答案,易出错、难控质;AgentRAG则引入ReAct推理链,支持查询分析、规划、多轮工具调度与迭代评估,让AI真正“先想再做”,从检索员升级为问题解决者。(239字)
420 3
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
9098 132
|
8月前
|
人工智能 容灾 调度
OpenClaw 源码拆解笔记,从启动到模型回复的完整链路
这是一份深度剖析 OpenClaw 源码的中文技术文档,涵盖安装(147篇)、工程主线(59篇)与AI核心框架(22篇),直达函数级实现,揭秘路由、Agent状态机、混合检索、容灾降级等设计原理,专为想搞懂或二次开发智能体框架的开发者打造。
3550 1
|
消息中间件 Java 数据处理
深入理解RabbitMQ中的prefetch_count参数
在某一次用户标签服务中大量用到异步流程,使用了RabbitMQ进行解耦。其中,为了提高消费者的处理效率针对了不同节点任务的消费者线程数和prefetch_count参数都做了调整和测试,得到一个相对合理的组合。这里深入分析一下prefetch_count参数在RabbitMQ中的作用。
1315 5
深入理解RabbitMQ中的prefetch_count参数
|
存储 SQL Apache
网易云信 x Doris:降本70%、提速11倍, 统一 ES/InfluxDB/Hive 多技术栈的落地实践
网易云信引入 Apache Doris 统一了原有 Elasticsearch、InfluxDB 和 Hive 多技术栈系统。凭借其高性能和易扩展的特点,提供一站式的数据存储和分析服务。实现机器成本降低 70%、实时场景查询提速 11 倍、离线任务耗时缩短 80% 的显著收益。
1058 0