项目地址javascript
单项目的时候只须要一个简单的配置文件便可完成配置管理。假如多个项目多个环境同时配置就会产生很是复杂的配置管理状况。java
这个时候就须要用到配置中心了,它的原理其实相似于redis缓存这种。不一样之处在于配置中心只关注配置,而且有更多的有利于配置的功能。大概的功能以下: node
同时这些功能也是此次要开发的配置中心须要包含的功能。git
本次开发的配置中心是基于nodejs的版本。 客户端获取配置的方式能够参考协议来开发属于本身的客户端SDK。目前已经提供的是javascript版本。github
配置中心的开发是基于nodejs的,这里先看一下大致的流程。web
从上面能够看到,一个配置中心最主要的功能包括:redis
落实到具体的开发上面其实很是简单,不少时候可能只须要一个了解和实践的过程。这里我把大概的思路跟你们捋一下。json
存储的目的只有2个:api
本教程目前只实现了本地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站点就是操做配置的地方。项目默认提供了几个接口用来获取和更新配置。
目前使用jQuery实现,界面比较简陋,基础功能已经实现了。
这里能够看到最上面是命名空间的标签。下面是添加命名空间。再往下是显示和编辑配置的地方。
心跳其实才是配置中心的核心内容。它主要的任务就是及时而且快速的通知到客户端配置有更新,须要使用最新的配置。
服务端使用nodejs的net.createServer
方法建立一个TCP的监听服务,若是客户端链接就会将客户端的链接对象放入对象缓存池。
在链接的时候这里作了2件事:
在链接以后就是心跳检测的过程了。客户端须要定时去更新本身的状态,服务端根据这个请求来更新客户端的最后存在时间,加入超时或者断开链接就表明客户端断线,就会将客户端从对象缓存池中移除。
若是web站点更新了对应的配置,服务端会主动发送命名到客户端。命令相似于操做|命名空间|更改值
,客户端根据收到的命令触发客户端的配置更新监听而且使用远程api更新客户端的缓存配置。
客户端自己会自动更新配置内容,同时提供了一个监听方法便于监听配置的更改。
在服务端根目录下有一个config
目录,这里就是给服务端多环境提供的配置。
只须要根据NODE_ENV
的值建立对应的文件便可。项目启动的时候会自动根据环境参数使用对应文件的配置。
若是你要问客户端的多环境?命名空间已经彻底能够实现了。若是要添加更多级的环境参数能够自定义命名空间的命名协议,好比:test.conf1
这样的方式便可在不更改主体程序的状况下实现多级配置环境。代价是须要修改web站点的界面。。。。
到此一个nodejs版本的轻量级配置中心已经开发完成。若是将上面最开始提到的功能所有完成,这个项目也就不只仅是一个轻量级的配置中心。它的功能已经彻底不亚于其余的开源配置中心了。
有兴趣的能够参与进来一块儿更新最好用的配置中心。