隨着使用 Nacos 的企業愈來愈多,遇到的最頻繁的兩個問題就是:如何在個人生產環境正確的來使用 namespace 以及 endpoint。這篇文章主要就是針對這兩個問題來聊聊使用 nacos 過程當中關於這兩個參數配置的最佳實踐方式。架構
namespce
關於 namespace ,如下主要從 namespace 的設計背景 和 namespace 的最佳實踐 兩個方面來討論。框架
namespace 的設計背景
namespace 的設計是 nacos 基於此作多環境以及多租戶數據(配置和服務)隔離的。即:分佈式
從一個租戶(用戶)的角度來看,若是有多套不一樣的環境,那麼這個時候能夠根據指定的環境來建立不一樣的 namespce,以此來實現多環境的隔離。例如,你可能有平常,預發和生產三個不一樣的環境,那麼使用一套 nacos 集羣能夠分別建如下三個不一樣的 namespace。以下圖所示:
函數
從多個租戶(用戶)的角度來看,每一個租戶(用戶)可能會有本身的 namespace,每一個租戶(用戶)的配置數據以及註冊的服務數據都會歸屬到本身的 namespace 下,以此來實現多租戶間的數據隔離。例如超級管理員分配了三個租戶,分別爲張3、李四和王五。分配好了以後,各租戶用本身的帳戶名和密碼登陸後,建立本身的命名空間。以下圖所示。
阿里雲
注意: 該功能還在規劃中。spa
namespace 的最佳實踐
關於 namespace 的最佳實踐 ,這部分主要包含有兩個 Action:設計
如何來獲取 namespace 的值
namespace 參數初始化方式
如何來獲取 namespace 的值
不管您是基於 Spring Cloud 或者 Dubbo 來使用 nacos,都會涉及到 namespace 的參數輸入,那麼這個時候 namespace 的值從哪裏能夠獲取呢?3d
若是您在使用過程當中沒有感知到這個參數的輸入,那麼 nacos 統一會使用一個默認的 namespace 做爲輸入,nacos naming 會使用 public 做爲默認的參數來初始化,nacos config 會使用一個空字符串做爲默認的參數來初始化。。
若是您須要自定義本身的 namespace,那麼這個值該怎麼來產生?server
能夠在 nacos 的控制檯左邊功能側看到有一個 命名空間 的功能,點擊就能夠看到 新建命名空間 的按鈕,那麼這個時候就能夠建立本身的命名空間了。建立成功以後,會生成一個命名空間ID,主要是用來避免命名空間名稱有可能會出現重名的狀況。所以當您在應用中須要配置指定的 namespace 時,填入的是命名空間ID。重要的事情說三遍,
當您在應用中須要配置指定的 namespace 時,填入的是命名空間 ID
當您在應用中須要配置指定的 namespace 時,填入的是命名空間 ID
當您在應用中須要配置指定的 namespace 時,填入的是命名空間 ID
說明: namesace 爲 public 是 nacos 的一個保留控件,若是您須要建立本身的 namespace,最好不要和 public 重名,以一個實際業務場景有具體語義的名字來命名,以避免帶來字面上不容易區分本身是哪個 namespace。中間件
namespace 參數初始化方式
nacos client 對 namespace 的初始化流程以下圖所示:
nacos client 對 namespace 的初始化,主要包含兩部分,
用戶態經過 nacos client 構造實例時經過 properties 參數傳入的 namespace
在雲環境下(阿里雲下的 EDAS)的 namespace 參數解析。
可經過 -Duse.cloud.namespace.parsing=true/false 來控制是否須要在雲環境自動解析 namespace 參數,默認爲 true,是會自動解析,其目的就是方便用戶上雲時能夠以零成本的方式平滑上雲。若是用戶在雲上須要用自建的 nacos 下的 namespace,那這個時候只需將 -Duse.cloud.namespace.parsing=false 便可。
endpoint
關於 endpoint ,也主要從 endpoint 的設計背景 和 endpoint 的參數初始化 兩個方面來討論。
endpoint 的設計背景
當 nacos server 集羣須要擴縮容時,客戶端須要有一種能力可以及時感知到集羣發生變化。及時感知到集羣的變化是經過 endpoint 來實現的。也即客戶端會定時的向 endpoint 發送請求來更新客戶端內存中的集羣列表。
endpoint 的參數初始化
Nacos Client 提供一種能夠對傳入的 endpoint 參數規則解析的能力。即當經過構造函數的 properties 來初始化 endpoint 時,指定的 endpoint 值能夠是一個具體的值,也能夠是一個佔位符的形式,以下所示:
${endpoint.options:defaultValue}。
說明:
endpoint.options 是一個具體的變量。支持從系統屬性,系統環境變量中讀取。
defaultValue 是給出的一個默認值。當從具體的變量中沒有被正確初始化時,會使用給出的默認值來初始化。
整個 endpoint 的解析規則比較複雜,總體的一個解析流程圖以下所示:
注意: 藍色特別區分的是支持雲環境下(阿里雲上的 EDAS)自動從系統環境變量中來讀取 endpoint 值,以此來達到用戶本地開發或者將應用往雲上遷移的時候以零成本的改造方式實現平滑上雲。
說明:
1.1. 若是在初始化 Nacos Client 的時候,沒有經過 properties 來指定 endpoint,這個時候會從系統環境變量中變量名爲 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值來初始化,若是系統環境變量也沒有設置,那麼這個時候將會返回一個空字符串。
1.2. 若是設置了 endpoint,
1.2.1 設置的 endpoint 是一個指定具體的值。
這時會先從系統環境變量中變量名爲 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值來初始化,若是系統環境變量沒有設置,那麼這個時候用用戶態傳入的具體值來初始化 endpoint。
1.2.2 以佔位符的形式輸入。
這時會解析出具體佔位符的值,而後:
依次從系統屬性和環境變量中來取值。
例如,您輸入的是 ${nacos.endpoint:defaultValue},那麼解析出來的 佔位符是 nacos.endpoint。解析出來後,會先讀取系統屬性中(即 System.getProperty("nacos.endpoint"))是否設置了 nacos.endpoint 變量值,若是沒有,則會從系統環境變量中變量名爲 nacos.endpoint 指定的值來初始化。
若是經過解析出來的佔位符尚未正確初始化 endpoint,則會從系統環境變量中變量名爲 ALIBABA_ALIWARE_ENDPOINT_URL 指定的值來初始化。
若是通過以上兩步尚未被初始化,這時若是您設置了默認值,這個時候就會使用默認值來初始化 endpoint,不然的話以解析出來的佔位符返回。
關閉 endpoint 參數規則解析
當關閉了 endpoint 參數規則解析的時候,這個時候就以用戶態在構造 Nacos Client 時經過 properties 參數輸入的 endpoint 值爲主。
默認狀況下, Nacos Client 是開啓 endpoint 參數規則解析的能力。若是你想關閉該能力,可在 Nacos Client 初始化的時候在傳入的 properties 實例中指定 key 爲 isUseEndpointParsingRule,值爲 false 便可關閉。
本文做者:彭兵庭,花名得少,GitHub ID @pbting,阿里巴巴高級開發工程師,主要研究方向分佈式系統中間件,致力於打造一套通用的分佈式系統中間件開發框架,下降分佈式系統中間件的開發門檻。Spring Cloud Alibab 和 Nacos 開源項目 committer。目前在軟負載團隊參與產品架構升級的相關工做。