「造个轮子」——cicada 设计一个配置模块(上)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。因此我按照自己的想法创建了一个 issue ,同时将 cicada 升级到了 v1.0.2。

目标


在做之前是要把需求想好,到底怎样的一个配置管理是对开发人员来说比较友好的?

我认为有以下几点:


  • 可以自定义配置,并且支持不同的环境(开发、测试、生产)。


  • 使用灵活。对使用者来说不要有太多的束缚。


理论上来说配置这个东西应当完全独立出来,由一个配置中心来负责管理并且这样可以与应用解耦。


不过这样的实现和当前 cicada 的定义有些冲突,我想尽量小的依赖第三方组件并可以完全独立运行。


因此基于这样的情况便有了以下的实现。


使用


在看实现之前先看看基于目前的配置管理如何在业务中使用起来。


结合现在大家使用 SpringBoot 的习惯,cicada 默认会读取 classpath 下的 application.properties 配置文件。并且会默认读取其中的应用端口以及初始路由地址。


同时也新增了一个 api。


public class MainStart {
    public static void main(String[] args) throws Exception {
        CicadaServer.start(MainStart.class,"/cicada-example") ;
    }
}
public class MainStart {
    public static void main(String[] args) throws Exception {
        CicadaServer.start(MainStart.class) ;
    }
}


这样在不传默认地址的时候 cicada 会从 application.properties 中读取。


考虑到后面可维护的情况,cicada 也支持配置各种不同的配置文件。


使用也比较简单,只需要继承 cicada 提供的一个抽象类即可。


public class KafkaConfiguration extends AbstractCicadaConfiguration {
    public KafkaConfiguration() {
        super.setPropertiesName("kafka.properties");
    }
}
public class RedisConfiguration extends AbstractCicadaConfiguration {
    public RedisConfiguration() {
        super.setPropertiesName("redis.properties");
    }
}



按照这样的配置也会默认从 classpath 读取这两个配置文件。


当然这里有个前提:代码里配置的文件名必须得和配置文件名称相同。


那如何在业务中读取这两个配置文件的内容呢?


这也简单,代码一看就懂:



  • 首先需要通过 ConfigurationHolder 获取各自不同配置的管理对象(需要显式指定类类型)。


  • 通过 get() 方法直接获取配置。


  • 同时也支持获取 application.properties 里的配置。


同时为了支持在不同环境的使用,当配置了启动参数将会优先读取。


-Dapplication.properties=/xx/application.properties
-Dkafka.properties=/xx/kakfa.properties
-Dredis.properties=/xx/redis.properties


这样算是基本实现了上述的配置要求。


实现


要实现以上的功能有几个核心点:


  1. 加载所有配置文件。


  1. 将不同的配置文件用不同的对象进行管理。


  1. 提供简易的接口使用。


由于 cicada 需要支持多个配置文件,所有需要定义一个抽象类供所有的配置管理实现。



定义比较简单,其中有两个重要的成员变量:


  • 文件名称:用于初始化时通过名称加载配置文件。


  • Properties 其实就是一个 Map 结构的缓存,用于存放所有的配置。当然对外提供的查询是基于它的。


接着就是在初始化时需要找出所有继承了 AbstractCicadaConfiguration 的类。



相关文章
|
前端开发 芯片
【芯片前端】保持代码手感——编写常值乘法器和一些拓展
【芯片前端】保持代码手感——编写常值乘法器和一些拓展
|
存储 前端开发 JavaScript
潮玩宇宙大逃杀无聊猿卷轴模式系统开发详细规则丨步骤需求丨方案项目丨技术架构丨源码功能
确定游戏类型和规则:明确无聊猿卷轴模式游戏类型和游戏规则,包括敌人类型、地图设计、任务类型、战斗机制等。
|
前端开发
前端学习笔记202305学习笔记第二十三天-项目重构构建
前端学习笔记202305学习笔记第二十三天-项目重构构建
71 0
|
前端开发
前端学习笔记202305学习笔记第二十三天-重构项目依赖安装
前端学习笔记202305学习笔记第二十三天-重构项目依赖安装
111 0
|
前端开发
前端学习笔记202305学习笔记第二十三天-项目重构构建2
前端学习笔记202305学习笔记第二十三天-项目重构构建2
78 0
|
JavaScript 前端开发
【从零到一手撕脚手架 | 第四节】加速开发效率 使用plop生成开发模板 使用mock进行数据模拟
基础的脚手架已经搭建完毕,如果我们想快速生成几个基础的组件模板我们可以使用Plop或者使用文件写入实现。比如我们不想等后端同学的接口,可以直接使用mock模拟数据生成。
300 0
【从零到一手撕脚手架 | 第四节】加速开发效率 使用plop生成开发模板 使用mock进行数据模拟
|
JavaScript 数据可视化 前端开发
你根本不知道“她“的全貌,「可视化」前端项目内部依赖 🍉
你根本不知道“她“的全貌,「可视化」前端项目内部依赖 🍉
323 0
|
缓存 容器
「造个轮子」——cicada 设计一个配置模块(下)
在前两次的 cicada 版本中其实还不支持读取配置文件,比如对端口、路由的配置。 因此我按照自己的想法创建了一个 issue ,同时将 cicada 升级到了 v1.0.2。
|
设计模式 JSON 缓存
「造个轮子」——cicada 源码分析(下)
本文就目前的 v1.0.1 版本来一起分析分析。
|
XML JSON 缓存
「造个轮子」——cicada 源码分析(上)
本文就目前的 v1.0.1 版本来一起分析分析。