项目地址 https://github.com/cuo9958/node-config
单项目的时候只需要一个简单的配置文件即可完成配置管理. 假如多个项目多个环境同时配置就会产生非常复杂的配置管理情况.
这个时候就需要用到配置中心了, 它的原理其实类似于 Redis 缓存这种. 不同之处在于配置中心只关注配置, 并且有更多的有利于配置的功能. 大概的功能如下:
同时这些功能也是这次要开发的配置中心需要包含的功能.
本次开发的配置中心是基于 Node.JS 的版本. 客户端获取配置的方式可以参考协议来开发属于自己的客户端 SDK. 目前已经提供的是 JavaScript 版本.
功能设计
配置中心的开发是基于 Node.JS 的, 这里先看一下大体的流程.
从上面可以看到, 一个配置中心最主要的功能包括:
数据存储. 这里使用存储协议匹配多种存储形式.
定时任务. 这里包含了定时存储和自定义的定时更新任务.
web 站点. 主要是提供一个简单快速的设置配置的方式.
心跳检测. 使用 TCP 协议将客户端和配置中心相连, 可以监听到配置的改动, 及时获取最新的配置内容.
开发功能
落实到具体的开发上面其实非常简单, 很多时候可能只需要一个了解和实践的过程. 这里我把大概的思路跟大家捋一下.
数据存储
存储的目的只有 2 个:
存储用到的配置. 这里只是简单的实现了列表, 存, 取的功能
用户登录.
本教程目前只实现了本地 JSON 文件的读写, 如果想要使用 MySQL 或者 Redis 等可以自己按照下面的协议实现.
init(), 存储库的初始化方法. 在项目启动的时候会第一时间调用.
list(), 获取命名空间列表. 这里使用命名空间区分不同的配置文件. 这里默认使用 def 来保存第一个文件.
all(namespace = "def"), 获取对应命名空间下的配置内容.
update(namespace, txt), 更新一个命名空间的所有配置. 这里传入的是字符串, 保存的也是字符串.
get(key, namespace = "def"), 获取对应命名空间下的某个字段的内容. 这里需要警惕, 配置不一定是 JSON 对象的.
set(key, val, namespace = "def"), 设置对应命名空间下的某个字段的值.
login(user, pwd), 登录判断, 目前返回 true 或者 false 就可以了.
只要是实现了上面协议的存储库就可以无痕替换掉项目的存储方式.
定时任务
固定的定时任务只有定时存储当前缓存的配置数据. 这里一个是为了项目重启的时候能够获得上次保存的配置内容, 另外一个也是为了防止程序崩溃的情况下能够不丢失已经保存的数据.
程序内容设定了一个状态变量 changed, 如果有对应的配置变动了, 就会将其的状态变更为 true. 定时保存任务就会在启动的时候讲数据保存在存储库中.
自定义定时任务的目的在于设置一个配置结果和定时时间, 当时间到了的时候就触发一次更新操作. 这个功能实现非常简单, 但是对于使用的人来说是一个非常好用的功能. 例如: 半夜 2 点定时上线某些产品什么的.... 在也不需要熬夜等了.
这次分享的项目还没有实现这个自定义定时更新功能. 在后续的更新中会逐步完善这个功能.
Web 站点
Web 站点就是操作配置的地方. 项目默认提供了几个接口用来获取和更新配置.
目前使用 jQuery 实现, 界面比较简陋, 基础功能已经实现了.
这里可以看到最上面是命名空间的标签. 下面是添加命名空间. 再往下是显示和编辑配置的地方.
心跳检测
心跳其实才是配置中心的核心内容. 它主要的任务就是及时并且快速的通知到客户端配置有更新, 需要使用最新的配置.
服务端使用 Node.JS 的 net.createServer 方法创建一个 TCP 的监听服务, 如果客户端连接就会将客户端的连接对象放入对象缓存池.
在连接的时候这里做了 2 件事:
给连接对象添加了一个 uuid, 方便辨认不同的客户端.
通知客户端发送验证令牌. 这里的逻辑比较简陋, 只是简单的验证一下.
在连接之后就是心跳检测的过程了. 客户端需要定时去更新自己的状态, 服务端根据这个请求来更新客户端的最后存在时间, 加入超时或者断开连接就代表客户端断线, 就会将客户端从对象缓存池中移除.
如果 Web 站点更新了对应的配置, 服务端会主动发送命名到客户端. 命令类似于操作 | 命名空间 | 更改值, 客户端根据收到的命令触发客户端的配置更新监听并且使用远程 API 更新客户端的缓存配置.
客户端本身会自动更新配置内容, 同时提供了一个监听方法便于监听配置的更改.
多环境配置
在服务端根目录下有一个 config 目录, 这里就是给服务端多环境提供的配置.
只需要根据 NODE_ENV 的值创建对应的文件即可. 项目启动的时候会自动根据环境参数使用对应文件的配置.
如果你要问客户端的多环境? 命名空间已经完全可以实现了. 如果要添加更多级的环境参数可以自定义命名空间的命名协议, 比如: test.conf1 这样的方式即可在不更改主体程序的情况下实现多级配置环境. 代价是需要修改 Web 站点的界面....
结束语
到此一个 Node.JS 版本的轻量级配置中心已经开发完成. 如果将上面最开始提到的功能全部完成, 这个项目也就不仅仅是一个轻量级的配置中心. 它的功能已经完全不亚于其他的开源配置中心了.
有兴趣的可以参与进来一起更新最好用的配置中心.
项目地址 https://github.com/cuo9958/node-config
来源: https://juejin.im/post/5bf39409f265da61461dc767