項目地址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版本的輕量級配置中心已經開發完成。若是將上面最開始提到的功能所有完成,這個項目也就不只僅是一個輕量級的配置中心。它的功能已經徹底不亞於其餘的開源配置中心了。
有興趣的能夠參與進來一塊兒更新最好用的配置中心。