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 的值從哪里可以獲取呢?
可以在 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 的解析規則比較復雜,整體的一個解析流程圖如下所示:
注意:?藍色特別區分的是支持云環境下(阿里云上的 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,否則的話以解析出來的占位符返回。
當關閉了 endpoint 參數規則解析的時候,這個時候就以用戶態在構造 Nacos Client 時通過 properties 參數輸入的 endpoint 值為主。
默認情況下, Nacos Client 是開啟 endpoint 參數規則解析的能力。如果你想關閉該能力,可在 Nacos Client 初始化的時候在傳入的 properties 實例中指定 key 為?isUseEndpointParsingRule,值為?false?即可關閉。
本文作者:彭兵庭,花名得少,GitHub ID @pbting,阿里巴巴高級開發工程師,主要研究方向分布式系統中間件,致力于打造一套通用的分布式系統中間件開發框架,降低分布式系統中間件的開發門檻。Spring Cloud Alibab 和 Nacos 開源項目 committer。目前在軟負載團隊參與產品架構升級的相關工作。
原文鏈接
本文為云棲社區原創內容,未經允許不得轉載。
總結
以上是生活随笔為你收集整理的Nacos: Namespace 和 Endpoint 在生产环境下的最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fun 3.0 发布——资源部署、依赖下
- 下一篇: ArchSummit分享 | 高德地图A