單專案的時候只需要一個簡單的配置檔案即可完成配置管理。假如多個專案多個環境同時配置就會產生非常複雜的配置管理情況。
這個時候就需要用到配置中心了,它的原理其實類似於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版本的輕量級配置中心已經開發完成。如果將上面最開始提到的功能全部完成,這個專案也就不僅僅是一個輕量級的配置中心。它的功能已經完全不亞於其他的開源配置中心了。
有興趣的可以參與進來一起更新最好用的配置中心。