1. 程式人生 > >Nacos: Namespace 和 Endpoint 在生產環境下的最佳實踐

Nacos: Namespace 和 Endpoint 在生產環境下的最佳實踐

隨著使用 Nacos 的企業越來越多,遇到的最頻繁的兩個問題就是:如何在我的生產環境正確的來使用 namespace 以及 endpoint。這篇文章主要就是針對這兩個問題來聊聊使用 nacos 過程中關於這兩個引數配置的最佳實踐方式。

namespce

關於 namespace ,以下主要從 namespace 的設計背景 和 namespace 的最佳實踐 兩個方面來討論。

namespace 的設計背景

namespace 的設計是 nacos 基於此做多環境以及多租戶資料(配置和服務)隔離的。即:

  • 從一個租戶(使用者)的角度來看,如果有多套不同的環境,那麼這個時候可以根據指定的環境來建立不同的 namespce,以此來實現多環境的隔離。例如,你可能有日常,預發和生產三個不同的環境,那麼使用一套 nacos 叢集可以分別建以下三個不同的 namespace。如下圖所示:

  • 從多個租戶(使用者)的角度來看,每個租戶(使用者)可能會有自己的 namespace,每個租戶(使用者)的配置資料以及註冊的服務資料都會歸屬到自己的 namespace 下,以此來實現多租戶間的資料隔離。例如超級管理員分配了三個租戶,分別為張三、李四和王五。分配好了之後,各租戶用自己的賬戶名和密碼登入後,建立自己的名稱空間。如下圖所示。

注意: 該功能還在規劃中。

namespace 的最佳實踐

關於 namespace 的最佳實踐 ,這部分主要包含有兩個 Action:

  • 如何來獲取 namespace 的值
  • namespace 引數初始化方式

如何來獲取 namespace 的值

無論您是基於 Spring Cloud 或者 Dubbo 來使用 nacos,都會涉及到 namespace 的引數輸入,那麼這個時候 namespace 的值從哪裡可以獲取呢?

  1. 如果您在使用過程中沒有感知到這個引數的輸入,那麼 nacos 統一會使用一個預設的 namespace 作為輸入,nacos naming 會使用 public 作為預設的引數來初始化,nacos config 會使用一個空字串作為預設的引數來初始化。。
  2. 如果您需要自定義自己的 namespace,那麼這個值該怎麼來產生?

    可以在 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}

說明:

  1. endpoint.options 是一個具體的變數。支援從系統屬性,系統環境變數中讀取。
  2. defaultValue 是給出的一個預設值。當從具體的變數中沒有被正確初始化時,會使用給出的預設值來初始化。

整個 endpoint 的解析規則比較複雜,整體的一個解析流程圖如下所示:

注意: 藍色特別區分的是支援雲環境下(阿里雲上的 EDAS)自動從系統環境變數中來讀取 endpoint 值,以此來達到使用者本地開發或者將應用往雲上遷移的時候以零成本的改造方式實現平滑上雲。

說明:

1. 開啟 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,否則的話以解析出來的佔位符返回。
  1. 關閉 endpoint 引數規則解析

    當關閉了 endpoint 引數規則解析的時候,這個時候就以使用者態在構造 Nacos Client 時通過 properties 引數輸入的 endpoint 值為主。

預設情況下, Nacos Client 是開啟 endpoint 引數規則解析的能力。如果你想關閉該能力,可在 Nacos Client 初始化的時候在傳入的 properties 例項中指定 key 為 isUseEndpointParsingRule,值為 false 即可關閉。

本文作者:彭兵庭,花名得少,GitHub ID @pbting,阿里巴巴高階開發工程師,主要研究方向分散式系統中介軟體,致力於打造一套通用的分散式系統中介軟體開發框架,降低分散式系統中介軟體的開發門檻。Spring Cloud Alibab 和 Nacos 開源專案 committer。目前在軟負載團隊參與產品架構升級的相關工作。

原文連結

本文為雲棲社群原創內容,未經