加一個適配層,更好的使用 Nacos 配置中心 | 文末有完整代碼

Nacos 爲咱們提供了很是好用的配置中心的功能,而且自帶了一個控制檯,可是每次更新配置時,須要對整個配置項的值進行修改,很是不方便。前端

如何更方便、優雅、安全的使用 Nacos 配置中心,就顯得很是重要,本篇文章我將爲你們介紹一種經過插件適配的方式,像操做 K-V 鍵值對那樣更加簡單的使用配置中心。數據庫

現有頁面的問題

咱們來看一下 Nacos 現有的配置管理頁面可能存在什麼問題,例如我有以下圖所示的一個配置項:安全

nacos-config-dashboard.jpg

若是讓用戶直接在 nacos 中管理這些配置,用戶將會很是頭疼,緣由以下:架構

1.對於非技術人員,諸如 jdbc.url 這種系統相關的配置項,他們不須要關心,也不該該由他們來管理這些配置項,直接暴露給他們的話,將會很是危險url

2.有些配置項沒法僅從 key 的命名中判斷出它的意思,由於他們並無作到那麼好的自解釋,例如上述配置中的 time.diff 就很具備疑惑性插件

3.配置的修改應該作到最小化,若是將全部的配置項所有暴露,可能會存在用戶在修改時不當心將其中某一個配置項刪除的狀況,這將會帶來災難性的後果設計

4.根據權限劃分的不一樣,配置項應該進行數據權限的隔離,不一樣的人應該只能看到本身所能修改的配置項,而不是看到全部配置項blog

一種更友好的頁面

假設咱們有一種以下圖所示更友好的操做頁面,那麼操做將變得更容易些:接口

config-manage-list.jpg

經過將一整個配置項的內容,拆分紅一個個更小的配置項,再爲每一個配置項加上一個說明信息,在這樣的頁面上操做是否是比直接在 Nacos 的控制檯上操做更方便、友好和安全呢?get

設計思路

爲了要實現這樣的功能,咱們能夠在原來配置中心的基礎上作一個適配層,以插件的形式對外提供配置項的查詢和修改服務。

主要的架構以下圖所示:

config-plugin-design.jpg

整個流程分爲三個部分:

1.Nacos 客戶端長輪詢服務端的配置信息

2.適配層從 Nacos 客戶端處獲取到完整的配置信息後拆分紅一個個更小的配置項

3.從適配層中對某一個配置項進行更新,而後將全部的小配置項再組裝成完整的配置項經過 Nacos 客戶端將內容更新到服務端

上圖中的 Config Unit 就是咱們須要關心的最小配置單元,經過這個配置單元,咱們就能夠爲每一個配置項指定諸如 「說明」 這樣的屬性。

配置單元須要有哪些屬性

咱們能夠自由設計配置單元中的屬性,根據業務場景咱們能夠爲配置單元設計如下屬性:

  • desc:這個屬性主要是用來對配置項進行描述說明
  • type:標識配置項的值類型,能夠用一個枚舉來定義
  • readOnly:標識該配置項是不是隻讀,若是是隻讀則不容許修改
  • grade:指定配置項的危險等級,主要是爲了作數據權限隔離

經過這些屬性就能夠將 Nacos 中完整的配置項拆分紅小的配置單元,能夠將配置單元理解爲配置項的元數據,這些元數據能夠保存在數據庫中或者是配置文件甚至也能夠保存在 Nacos 中,只要保證每一個配置項都能對應一個配置單元便可。

插件須要有哪些能力

適配層其實只須要提供配置項的查詢和更新的功能便可,查詢分爲查詢列表和單個配置項。具體的接口定義以下圖所示:

nacos-config-service.jpg

查看幾種效果

下面咱們來查看下效果,具體的實現過程不在這裏進行詳細的描述,文末有完整實現代碼。

獲取配置列表

查詢 grade 小於等於 5 的全部配置項:

get-config-list-1.jpg

查詢 grade 小於等於 2 的全部配置項:

get-config-list-2.jpg

這裏的 grade 一方面能夠用來進行數據權限的隔離,也能夠給前端做爲「危險」等級展現的依據,grade 值越大的表示該配置項越危險,修改時須要格外注意。

查詢單個配置項

根據 key 查詢單個配置項:

get-config-item.jpg

當咱們系統中須要獲取某個配置項的值時,就能夠調用該接口。

更新配置項

更新一個不存在的配置項:

update-config-1.jpg

更新一個配置項,可是權限不夠,提交的 grade 低於該配置項的 grade:

update-config-2.jpg

更新某個配置項,可是該配置項爲只讀:

update-config-3.jpg

更新某個配置項,可是指定了一個錯誤的值類型:

update-config-4.jpg

正確更新某個配置項:

update-config-success.jpg

查看Nacos中的值

經過適配層更新完配置信息後,咱們來檢查下 Nacos 中的配置項是否發生了改變,以下圖所示:

update-config-effect.jpg

能夠發現,Nacos 服務端中該配置項的值已經更新。

實際環境中使用

要在實際環境中使用該插件,須要解決如下幾個問題:

一、配置單元

首先咱們須要爲 Nacos 中的每一個配置項對應一個配置單元,爲他們指定各類屬性,而後將配置單元持久化到數據庫或者配置文件中,方便插件進行獲取配置單元的列表。

二、權限隔離

須要對全部的配置單元進行分類,即爲他們維護好 grade,並在大家的系統中根據權限模型進行數據權限隔離,例如:

普通用戶的角色能夠查看並修改 grade <= 2 的配置項;

管理員角色能夠查看並修改 grade<= 5 的配置項;

超級管理員角色能夠查看並修改全部的配置項。

可是若是經過 grade 明文傳輸的話,被別人抓取到報文後,極可能僞造請求,因此最好的是結合系統的權限模塊進行數據權限的整合。

完整代碼

目前我已經實現了該插件的功能,若是須要完整的代碼,能夠在公衆號內回覆「配置中心插件」獲取,不須要的直接忽略這段就好。

逅弈逐碼,專一於原創分享,用通俗易懂的圖文描述源碼及原理

相關文章
相關標籤/搜索