輕量級配置中心Nodejs版

項目地址javascript

單項目的時候只須要一個簡單的配置文件便可完成配置管理。假如多個項目多個環境同時配置就會產生很是複雜的配置管理狀況。java

這個時候就須要用到配置中心了,它的原理其實相似於redis緩存這種。不一樣之處在於配置中心只關注配置,而且有更多的有利於配置的功能。大概的功能以下: node

同時這些功能也是此次要開發的配置中心須要包含的功能。git

本次開發的配置中心是基於nodejs的版本。 客戶端獲取配置的方式能夠參考協議來開發屬於本身的客戶端SDK。目前已經提供的是javascript版本。github

功能設計

配置中心的開發是基於nodejs的,這裏先看一下大致的流程。web

從上面能夠看到,一個配置中心最主要的功能包括:redis

  1. 數據存儲。這裏使用存儲協議匹配多種存儲形式。
  2. 定時任務。這裏包含了定時存儲和自定義的定時更新任務。
  3. web站點。主要是提供一個簡單快速的設置配置的方式。
  4. 心跳檢測。使用TCP協議將客戶端和配置中心相連,能夠監聽到配置的改動,及時獲取最新的配置內容。

開發功能

落實到具體的開發上面其實很是簡單,不少時候可能只須要一個瞭解和實踐的過程。這裏我把大概的思路跟你們捋一下。json

數據存儲

存儲的目的只有2個:api

  1. 存儲用到的配置。這裏只是簡單的實現了列表、存、取的功能
  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實現,界面比較簡陋,基礎功能已經實現了。

這裏能夠看到最上面是命名空間的標籤。下面是添加命名空間。再往下是顯示和編輯配置的地方。

心跳檢測

心跳其實才是配置中心的核心內容。它主要的任務就是及時而且快速的通知到客戶端配置有更新,須要使用最新的配置。

服務端使用nodejs的net.createServer方法建立一個TCP的監聽服務,若是客戶端鏈接就會將客戶端的鏈接對象放入對象緩存池。

在鏈接的時候這裏作了2件事:

  1. 給鏈接對象添加了一個uuid,方便辨認不一樣的客戶端。
  2. 通知客戶端發送驗證令牌。這裏的邏輯比較簡陋,只是簡單的驗證一下。

在鏈接以後就是心跳檢測的過程了。客戶端須要定時去更新本身的狀態,服務端根據這個請求來更新客戶端的最後存在時間,加入超時或者斷開鏈接就表明客戶端斷線,就會將客戶端從對象緩存池中移除。

若是web站點更新了對應的配置,服務端會主動發送命名到客戶端。命令相似於操做|命名空間|更改值,客戶端根據收到的命令觸發客戶端的配置更新監聽而且使用遠程api更新客戶端的緩存配置。

客戶端自己會自動更新配置內容,同時提供了一個監聽方法便於監聽配置的更改。

多環境配置

在服務端根目錄下有一個config目錄,這裏就是給服務端多環境提供的配置。

只須要根據NODE_ENV的值建立對應的文件便可。項目啓動的時候會自動根據環境參數使用對應文件的配置。

若是你要問客戶端的多環境?命名空間已經徹底能夠實現了。若是要添加更多級的環境參數能夠自定義命名空間的命名協議,好比:test.conf1這樣的方式便可在不更改主體程序的狀況下實現多級配置環境。代價是須要修改web站點的界面。。。。

結束語

到此一個nodejs版本的輕量級配置中心已經開發完成。若是將上面最開始提到的功能所有完成,這個項目也就不只僅是一個輕量級的配置中心。它的功能已經徹底不亞於其餘的開源配置中心了。

有興趣的能夠參與進來一塊兒更新最好用的配置中心。

項目地址

相關文章
相關標籤/搜索