单项目的时候只需要一个简单的配置文件即可完成配置管理。假如多个项目多个环境同时配置就会产生非常复杂的配置管理情况。
这个时候就需要用到配置中心了,它的原理其实类似于redis缓存这种。不同之处在于配置中心只关注配置,并且有更多的有利于配置的功能。大概的功能如下:
同时这些功能也是这次要开发的配置中心需要包含的功能。
本次开发的配置中心是基于nodejs的版本。 客户端获取配置的方式可以参考协议来开发属于自己的客户端SDK。目前已经提供的是javascript版本。
功能设计
配置中心的开发是基于nodejs的,这里先看一下大体的流程。
从上面可以看到,一个配置中心最主要的功能包括:
- 数据存储。这里使用存储协议匹配多种存储形式。
- 定时任务。这里包含了定时存储和自定义的定时更新任务。
- 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站点就是操作配置的地方。项目默认提供了几个接口用来获取和更新配置。