單項目的時候只需要一個簡單的配置文件即可完成配置管理。假如多個項目多個環境同時配置就會產生非常複雜的配置管理情況。
這個時候就需要用到配置中心了,它的原理其實類似於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站點就是操作配置的地方。項目默認提供了幾個接口用來獲取和更新配置。
目前使用jQuery實現,界面比較簡陋,基礎功能已經實現了。
這裏可以看到最上面是命名空間的標籤。下面是添加命名空間。再往下是顯示和編輯配置的地方。
心跳檢測
心跳其實才是配置中心的核心內容。它主要的任務就是及時並且快速的通知到客戶端配置有更新,需要使用最新的配置。
服務端使用nodejs的net.createServer
方法創建一個TCP的監聽服務,如果客戶端連接就會將客戶端的連接對象放入對象緩存池。
在連接的時候這裏做了2件事:
- 給連接對象添加了一個uuid,方便辨認不同的客戶端。
- 通知客戶端發送驗證令牌。這裏的邏輯比較簡陋,只是簡單的驗證一下。
在連接之後就是心跳檢測的過程了。客戶端需要定時去更新自己的狀態,服務端根據這個請求來更新客戶端的最後存在時間,加入超時或者斷開連接就代表客戶端斷線,就會將客戶端從對象緩存池中移除。
如果web站點更新了對應的配置,服務端會主動發送命名到客戶端。命令類似於操作|命名空間|更改值
,客戶端根據收到的命令觸發客戶端的配置更新監聽並且使用遠程api更新客戶端的緩存配置。
客戶端本身會自動更新配置內容,同時提供了一個監聽方法便於監聽配置的更改。
多環境配置
在服務端根目錄下有一個config
目錄,這裏就是給服務端多環境提供的配置。
只需要根據NODE_ENV
的值創建對應的文件即可。項目啓動的時候會自動根據環境參數使用對應文件的配置。
如果你要問客戶端的多環境?命名空間已經完全可以實現了。如果要添加更多級的環境參數可以自定義命名空間的命名協議,比如:test.conf1
這樣的方式即可在不更改主體程序的情況下實現多級配置環境。代價是需要修改web站點的界面。。。。
結束語
到此一個nodejs版本的輕量級配置中心已經開發完成。如果將上面最開始提到的功能全部完成,這個項目也就不僅僅是一個輕量級的配置中心。它的功能已經完全不亞於其他的開源配置中心了。
有興趣的可以參與進來一起更新最好用的配置中心。