昨天突然来了一个需求,因为我们有公有云 和 私有云多种环境的部署 需求,所以, 版本管理是一个影响研发效率的事情 主要是以下几个方面

  1. sql 的版本管理
  2. nacos 等config 配置的版本管理
  3. 代码的版本管理

这节里 先说nacos的 配置管理

需求

想统一管理 nacos的 配置管理,有哪几种办法呢?

方案一

统一监听 nacos的 配置改动,后台进行记录,为了扩展性 发送到mq,大概的样子是这样

这里有一个问题 ,我怎么保证 nacos 和 发送mq的事务问题呢?万一 nacos改成功了,但是mq 发送失败呢? 本来我不想该nacos的 代码,想在外围找一个中转项目,放到mq,但是因为事务的问题,还是需要 改动nacos的代码,让mysql 修改和 发送mq 在一个事务中

方案二

我们启动一个平台,在平台上进行 nacos的操作,然后调用nacos openApi 来调用nacos server 来实现对应的修改 ,然后我们在平台 对config 进行统一的管理。这样 只要我们表和需求 设计的合理,就可以 满足后面的 基本所有扩展需求 。比如 导出某个版本的 nacos config

这里 还有一个点,每次操作是 放变更的情况 还是 全部的记录,这里选择的是全部的config 内容。省的有一个地方记录错误 导致上线的config 配置不全的情况

两个方案的比较

方案一 更适合 对配置改动进行监听,影响某些配置的情况。

方案二 更适合我们这次的需求 之后对nacos的 修改都通过 平台走,进行统一管理

说干就干 调研

首先明确下 我们这次的需求 需要nacos 提供什么功能

nacos需要提供的接口:

  1. 根据namespace 文件名称 获取文件内容 接口
  2. crud namespace
  3. 手动修改 配置文件
  4. 看上一个版本的配置

开始

准备工作

这种接口肯定 默认nacos 就提供了,我先去 nacos 官网看看,应该很简单 []( Open API 指南 (nacos.io) )

还真有

开心,这不是有手就行,轻轻松松

我调用了第一个 获取配置 的接口 结果报了一个

{"timestamp":"2022-08-24T13:55:43.501+08:00","status":403,"error":"Forbidden","message":"unknown user!","path":"/nacos/v1/cs/configs"}
复制代码

我靠,忘了,这还有一个权限验证开了,虽然 nacos 本身内网访问的,不给外网,但 还是开了权限。开权限这个事是对的,骂不了。。。。忍了,解决下吧

按照其他的项目 套路,肯定这时候有一个 accessToken 或者类似的token 做认证,找找吧。找到了

curl -X POST 'localhost:8848/nacos/v1/auth/login' -d 'username=xxx&password=xxx'
复制代码

访问下,返回的

{"accessToken":"xxx","tokenTtl":18000,"globalAdmin":false}
复制代码

看到了 tokenTtl 为18000,我去,还有时间限制 哭哭,忍了,先做一个redis 缓存,等再次返回403的时候 我重新获取下 accessToken ,重新赋值redis ,这样总可以了吧。。。。

好奇点 tokenTtl 单位是什么 ms? 是哪个属性 控制的tokenTtl?

那就看看被

直接下载nacos 代码 我们是2.0.0 ,查找下 login 找找Controller ,找到了 UserController login 方法。

基础情况

nacos.core.auth.system.type=nacos nacos.core.auth.default.token.expire.seconds:18000

获取配置

按照文档 我就调用

curl -X GET 'http://xxx:8848/nacos/v1/cs/configs?dataId=xxx&group=xxx&accessToken=xxx&tenant=xxx'
复制代码

tenant 用的是 命名空间ID 别的没什么,这个接口就算ok了

crud namespace 查询命名空间列表

curl -X GET 'http://localhost:8848/nacos/v1/console/namespaces'
复制代码

这个都不要权限 直接访问就行,更简单 ok 下一个

手动修改 配置文件(发布 Nacos 上的配置)

curl -X POST 'http://xxx:8848/nacos/v1/cs/configs' -d 'dataId=nacos.example&group=com.alibaba.nacos11111&content=contentTest&accessToken=xxx&tenant=111'
复制代码

输出

为了 私有化部署的方便 和 版本管理,最后nacos 这块要输出 两个部分,一个是nacos 结构的变化(比如 namespace 文件的新增 等等) 和 对应的内容变动 。然后我们到时候写一个脚本进行 对私有云nacos的 更新

回滚

更新这部分可以了,但是回滚这块呢,我想想

  1. 我可以先对nacos 这个库进行备份
  2. 我不做备份 ,通过调用历史版本接口 根据 lastModifiedTime 最后修改时间进行 判断是否回滚

异常情况的拦截 和 提示

这个等我写完 贴到这,给大家一个类,也可以wx 联系我哈

总结

这第一版的 基本思路就是这样,慢慢补充

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐