配置中心框架IConfCenter

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 本篇和大家分享的是一个简易配置中心框架IConfCenter,框架是利用空余时间写的,主要以配置文件+redis存储方式作为数据同步驱动,目前支持的配置文件格式有 .properties 和 .config,后期有时间可能增加 .xml 和 .yml文件的识别。

本篇和大家分享的是一个简易配置中心框架IConfCenter,框架是利用空余时间写的,主要以配置文件+redis存储方式作为数据同步驱动,目前支持的配置文件格式有 .properties 和 .config,后期有时间可能增加 .xml.yml文件的识别。
框架结构简单分为:

  • confserver - 服务端
  • confAdmin - 配置中心后台管理
  • confCenter - 配置中心
  • confclient - 客户端
  • 每分钟获取配置
  • 订阅配置中心刷新配置

confAdmin - 配置中心后台管理

后台管理主要就是一个简单的操作界面,采用springboot+thymeleaf+jquery搭建,目前主要有两个功能:展示配置文件列表和启用某个配置

展示配置文件列表:其实就是读取本地磁盘目录中的配置文件信息,主要的service代码如下:

    /**
     * 配置文件列表
     *
     * @return
     */
    public List<File> getListConf() {
        File baseFile = new File(confCenterConf.confserver_confs_basepath);
        File[] files = baseFile.listFiles();
        List<File> list = Arrays.asList(files).
                stream().
                sorted(Comparator.comparing(File::lastModified).reversed()).
                collect(Collectors.toList());
        return list;
    }

启用某个配置:主要通过界面按钮触发ajax提交一个启动post请求,后端通过解析指定配置文件内容为Map结构,并永久存储于Redis缓存中(直到下一次配置内容更新),最后通过Redis的发布功能通知给订阅该配置的客户端,让客户端通过api重新获取并更新本地配置。主要的Service代码如下:

    /**
     * 启用某个配置+通知消费端(订阅channel规则:confs_配置文件名)
     *
     * @param confPath
     * @return
     */
    public MoRp qyConf(String confPath) {
        MoRp rp = new MoRp();
        rp.setStatus(EnumHelper.EmRpStatus.失败.getVal());

        try {
            //读取配置文件
            Map<String, Object> map = LoadConf.readConfToMap(confPath);
            if (map.isEmpty()) {
                rp.setMessage("加载配置文件失败,稍后重试");
                return rp;
            }

            //文件名称
            String filePathToName = LoadConf.getFilePathToName(confPath, true);

            //缓存key
            String cacheKey = String.format("confs_%s", filePathToName);

            //2018.09.13 临时增加配置文件修改时间
            File file = new File(confPath);
            MoGetConfRp confRp = new MoGetConfRp();
            confRp.setConfLastModified(file.lastModified());
            confRp.setConfs(map);
            confRp.setConfVersion(filePathToName);
            confRp.setStatus(EnumHelper.EmRpStatus.成功.getVal());

            //存储到缓存中 永久
            if (jedisTool.set(cacheKey, confRp, 0)) {

                //发布消息,通知客户端更新配置
                jedisTool.publish(cacheKey, confRp.getConfVersion());
                rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
                rp.setMessage(EnumHelper.EmRpStatus.成功.toString());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return rp;
    }

confCenter - 配置中心

主要提供了一个获取指定版本的配置文件信息api,信息来源由Redis缓存提供,当Redis缓存不存在时不会去解析配置文件,因此主要用ConfiAdmin管理后台触发数据来源。其主要代码:

    /**
     * 获取配置信息
     *
     * @param rq
     * @return
     */
    public MoGetConfRp getconf(MoGetConfRq rq) {

        MoGetConfRp rp = new MoGetConfRp();
        try {
            //未指定配置版本,采用默认配置版本
            if (rq.getConfVersion().isEmpty()) {
                rq.setConfVersion(confCenterConf.confserver_confs_currentConfVersion);
            }
            if (rq.getConfVersion().isEmpty()) {
                rp.setMessage("未找到配置版本");
                return rp;
            }

            //缓存key
            String cacheKey = String.format("confs_%s", rq.getConfVersion());

            //获取缓存中是否存在
            rp = jedisTool.get(cacheKey, MoGetConfRp.class);
            if (rp.getStatus() == EnumHelper.EmRpStatus.成功.getVal() &&
                    rp.getConfs().size() >= 1) {
                rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
                rp.setMessage(EnumHelper.EmRpStatus.成功.toString());
                return rp;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return rp;
    }

confclient - 客户端

主要干了两个事情:每分钟获取配置和订阅配置中心刷新配置。该客户端项目各位可以打包成jar引入项目中,加上相关配置即可引入配置中心客户端

每分钟获取配置

为了配置内容的一致性,这里采用了Scheduled每隔一分钟请求一下配置中心api,然后通过版本号对比是否有更新,如果对比有新版本那么即可更新缓存于本地的配置信息。主要代码如:

/**
     * 每分钟获取配置,版本号不一致更新本地缓存
     * 
     */
    @Scheduled(initialDelay =  1000 * 60,fixedDelay = 1000 * 60)
    public void refreshConf() {
        System.out.println(new Date() + ":当前配置版本" +
                confCenterConf.confserver_confs_currentConfVersion);
        if (confCenterConf.confserver_confs_currentConfVersion.isEmpty()) {
            System.out.println("版本为空,无法自动拉取配置");
            return;
        }
        updateConf(confCenterConf.confserver_confs_currentConfVersion);
    }

    /**
     * 更新本地配置
     * @param strVersion
     */
    private void updateConf(String strVersion) {
        //获取配置中心配置
        MoGetConfRp rp = confCenterClientService.getConfCenterConf(strVersion);
        if (rp.getStatus() != EnumHelper.EmRpStatus.成功.getVal()) {
            return;
        }else if(rp.getConfLastModified() == confCenterClientService.getConfLastModified()){
            return;
        }
        System.out.println(new Date() + ":更新本地配置");
        //版本不一致,更新本地缓存
        confCenterClientService.setConf(rp);
    }

订阅配置中心刷新配置

通过实现CommandLineRunner接口的run方法,在项目启动时通过Redis订阅配置中心消息,达到配置中心主动通知更新配置的目的。主要代码:

    /**
     * 程序启动执行服务 订阅配置中心刷新配置通道
     * 
     * @param strings
     * @throws Exception
     */
    @Override
    public void run(String... strings) throws Exception {
        //订阅配置中心刷新配置通道
        jedisTool.subscribe(
                "confs_" + confCenterConf.confserver_confs_currentConfVersion,
                b -> {
                    System.out.println(new Date() + ":收到配置中心刷新配置通知,版本-" + b);
                    updateConf(b.toString());
                });
    }

在文章结尾时,发一张配置中心应用到项目中的手工设计图,并希望各位能够喜欢配置中心框架IConfCenter
_

_

目录
相关文章
|
关系型数据库 MySQL 数据库
一文剖析MySQL主从复制异常错误代码13114
一文剖析MySQL主从复制异常错误代码13114
1624 0
|
小程序 数据库 微服务
结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录
结合ruoyi-cloud和ruoyi-app实现微信小程序的授权登录
1231 0
|
安全 数据安全/隐私保护 芯片
微信读书电脑版,来了!
微信读书电脑版,来了!
|
6月前
|
SQL Java 关系型数据库
Dataphin功能Tips系列(53)-离线集成任务如何合理配置JVM资源
本文探讨了将MySQL数据同步至Hive时出现OOM问题的解决方案。
165 5
|
前端开发 API 决策智能
多智能体微调实践:α-UMi 开源
近年来,为了加强大型语言模型(Large-Language Models, LLM)实时信息处理、解决专业问题的能力,催生了工具调用智能体(Tool Integrated Agent)概念
|
SQL 分布式计算 Apache
Dataphin x Iceberg 开箱即用的数据湖治理解决方案
Apache Iceberg作为新一代开源数据湖表格式,具备ACID事务、时间旅行和高效Schema演化等能力。Dataphin已完成与Iceberg的深度集成,通过全链路适配与性能优化,为企业提供开箱即用的数据湖治理方案,涵盖数据源支持、离线与实时数据集成、数据研发等核心模块,助力构建现代化数据架构。
226 0
|
9月前
|
人工智能 BI 自然语言处理
【瓴羊数据荟】 共话AI×Data的企业应用进化,瓴羊「数据荟」MeetUp城市行上海场顺利收官!
瓴羊「数据荟」Meet Up城市行系列活动第四期活动将于3月7日在上海举办,由中国信息通信研究院与阿里巴巴瓴羊专家联袂呈现,共同探讨AI时代的数据应用实践与企业智能DNA的革命性重构。
381 0
【瓴羊数据荟】  共话AI×Data的企业应用进化,瓴羊「数据荟」MeetUp城市行上海场顺利收官!
|
11月前
|
数据挖掘 Python
时间序列分析中的互相关与相干性分析:前导-滞后关系的理论基础与实际应用
时间序列数据在现代数据分析中广泛应用,从金融市场到生物医学领域。本文重点介绍两种分析工具:互相关和相干性分析。互相关用于量化两个时间序列的时域关系,揭示前导-滞后关系;相干性分析则评估信号在频率域的相关性,适用于脑电图等研究。通过实际案例和Python代码示例,展示了这两种方法的应用价值。
1149 8
时间序列分析中的互相关与相干性分析:前导-滞后关系的理论基础与实际应用
|
人工智能 算法 BI
聚焦AI与BI融合,引领数智化新潮流 | 【瓴羊数据荟】瓴羊数据Meet Up城市行第一站完美收官!
当BI遇见AI,洞见变得触手可及 —— 瓴羊「数据荟」数据Meet Up城市行·杭州站启幕,欢迎参与。
1202 5
聚焦AI与BI融合,引领数智化新潮流 | 【瓴羊数据荟】瓴羊数据Meet Up城市行第一站完美收官!
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
672 19

热门文章

最新文章