nacos-使用git方式管理配置文件

1. 为什么要采用git方式管理配置文件

    因为最开始使用的是 spring 原生的配置中心 ,用git 方式做配置管理,后来转到 nacos 之后,发现有很多方面都不如这种方式控制起来优雅。

    如:

    * nacos 自带配置编辑工具使用起来不方便

    * 没有便捷的格式校验工具

    * 没有非常明细的历史记录(如某一行是谁在哪个时间点提交的)

    * 没办法做到配置草稿功能(没办法提前把配置准备好,只能再上线时一条条添加修改,git方式可以提前提交到其他分支,上线时,直接合并主干即可发布。)

 

2. 实现方式

    在查看 nacos issues 时,发现原来有别人提过该问题,

    地址: 增加支持从git或svn读取配置文件    

    但是时间比较久远,而且nacos 并没有宣布支持,

    所以秉承着自己动手丰衣足食的理念,那就自己实现。

 

3. config相关代码解耦重构

    梳理了一下相关逻辑,发现可以将导入部分进行解耦复用,这样git 进行文件读取及导入的时候就能复用了,但是考虑到影响性,目前并没有将原有导入方法进行修改。

    先把代码地址附上: https://github.com/moonciki/nacos/tree/moonciki_git_support_%235797

    该分支目前已经实现了配置git 仓库,按需更新配置文件,界面暂时还未完成。

    因为不清楚该pr能否并入nacos 主干,所以原有导入方法并没有改动。

    主要代码功能如下:

    ConfigController.java : 添加导入方法 importAndPublishConfigNew(该方法可无缝替换原来导入方法) :

    ConfigInfoHandlerService.java: 配置文件解析及导入service,提供了配置数据存库等一些操作。

    ConfigInfoHandlerServiceImpl.java: 上述service 唯一实现类

        由于nacos 支持derby 及 mysql 数据源,因此,在操作数据库时 nacos 都实现了两套持久化操作逻辑:EmbeddedxxxxServiceImpl(derby) 及 ExternalxxxxServiceImpl(mysql)。

        但是由于很多业务操作是一样的,只是存库操作不一样,原有代码将业务操作写了两遍,有很多冗余的代码,因此参考原有代码,抽离了这层结构,主要方法为 batchInsertOrUpdate ,这样业务逻辑只需要在此层写一遍,然后调用不同的持久化实现了就可以了。

        其他具体参考源码,此处不做赘述。

    ConfigDataReader: 解析处理配置文件的公共抽象类,提供了一些基本方法,后续如需拓展,只需集成此抽象类即可。

    ZipConfigDataReader:上述抽象类的 zip 抽象类,由于V1 格式 和 v2 格式区别只在于meta 文件,因此将zip 的公共解析部分再该方法做了实现。

    ZipConfigDataReaderV1, ZipConfigDataReaderV2 : 上述zip 抽象类的 v1 及 v2 格式实现类,也可以考虑将配置克隆方法也采用此方式解析保存处理。

    数据实体类

    ConfigBatchResultVo.java: 原导入接口返回map,这里使用实体类替换原来的map。

    ConfigDataBatchVo.java: 初步读取文件原始内容对象,包括meta 及 配置信息

    ConfigImportDataVo.java: 通过上一类数据,根据mata 及 配置,解析完成的对应配置信息。

    ConfigImportItemVo.java: 读取的单一文件信息。

    ConfigImportResultVo.java:配置数据保存详细结果信息,后期使用git 保存时,希望返回更详尽的更改记录,比如 新增、修改、删除、未变更,跳过的等。

    NacosWebException.java: 自定义异常类,之所以添加新的自定义异常,1是防止改之前异常类会影响其他地方,2是有很多地方需要返回某些错误信息,但是由于这些方法需要返回其他数据,所以如果将错误状态作为返回值显然不太优雅。使用该异常类,只需在需要返回错误的地方,抛出此异常,即可达到返回错误信息,并中断的效果。然后再需要的地方捕获该异常,拿到错误信息数据,并返给前端。通常如果不需要根据错误信息做其他处理的话,只需要添加全局拦截类,拦截该异常,并将该异常封装成web 所用数据格式即可,这样就不需要有过多的无用的try-catch 处理逻辑,这样代码更优雅一些。同时也建议其他项目采用此种异常及错误信息返回方式。为了防止有其他影响,我们这里只在controller 层添加异常拦截处理,并不做全局拦截。

    WebCode.java: 错误信息类,用来便捷转换为上方异常类,由于枚举无法继承,所以使用枚举统一转换为此类,方便自定义异常的错误信息回传。

 

4. git 配置功能支持

    代码地址:https://github.com/moonciki/nacos/tree/moonciki_git_support_%235797

    初期是准备将config 解耦,与 git 支持分开合并nacos 主干的,所以做了两个分支,该分支只添加了git 模块,及修改了pom 依赖关系,该模块参考自 spring-cloud-config-server 相关源码,并做了部分改动,由于代码比较多,加上结构也比较简单,这里不一一指出,只对主要文件做介绍。

    实现方式

    git 只是作为配置文件存储的一个来源,类似于现有导入方式,在nacos 中,最终的配置文件还是存在于数据库中,这样避免更改之前的业务逻辑。

    简易流程图如下:

 

 

 

    该模块添加了 tenant_git 表。

    主要相关代码如下:

    GitControllerInterceptor.java:当前 git 模块统一异常拦截类。

    GitConfigController.java: 接口入口类,目前前端界面还在实现中,实现完后会补充。

    GitConfigService.java: git 操作相关业务service.

    GitConfigServiceImpl.java: 上述实现类。

    JgitOperationService.java:jgit 相关操作类,缓存了系统中每个命名空间对应的 git 连接客户端。

    JgitOperationServiceImpl.java: 上述实现类

    JGitEnvironmentRepository.java: jgit 公共操作方法类。

   

    其他类请参考源码,在此不多赘述。

    该模块还在持续完善中,但最主要功能已完成,支持git 密码方式登录,支持ssh 秘钥方式登录。准备等配置解耦合并主干后,再上述基础上做配置同步功能,后续会持续更新本博文。

 

posted @ 2022-08-09 17:46  星辰大海的征途  阅读(1308)  评论(0编辑  收藏  举报