Nacos 服務發現的核心模型
Nacos 服務發現的核心數據模型主要圍繞以下幾個關鍵概念構建,它們共同構成了服務注冊與發現的基礎:
-
Namespace (命名空間):
- 用途: 用于進行環境隔離。比如,你可以為開發環境 (dev)、測試環境 (test) 和生產環境 (prod) 創建不同的 Namespace。不同 Namespace 之間的服務、配置是完全隔離的。
- 層級: 位于整個模型的頂層,是隔離資源(服務、配置)的第一道屏障。默認情況下有一個
public
Namespace。
-
Group (分組):
- 用途: 在同一個 Namespace 下,對服務或配置進行邏輯分組。這提供了一種比 Namespace 更細粒度的隔離或分類方式。例如,可以將同一個 Namespace 下的不同業務線或項目劃分到不同的 Group。
- 層級: 位于 Namespace 之下,Service/Configuration 之上。默認分組是
DEFAULT_GROUP
。
-
Service (服務):
- 定義: 對外提供特定功能的一組計算資源的抽象名稱。例如,“用戶服務”、“訂單服務”。一個 Service 通常由一個或多個能提供相同功能的 Instance 組成。
- 作用: 服務消費者通過服務名 (ServiceName) 來查找提供該服務的具體實例列表。
- 唯一標識: 在同一個
Namespace + Group
下,ServiceName
必須是唯一的。
-
Instance (實例):
- 定義: 一個實際運行的、能夠提供 Service 定義的功能的進程或節點。每個 Instance 通常由 IP 地址和端口號唯一標識。
- 屬性: 除了 IP 和端口,Instance 還包含其他元數據 (Metadata),例如:
- Weight (權重): 用于負載均衡,權重越高的實例接收到的請求理論上越多。
- Health Status (健康狀態): Nacos 服務端或客戶端會檢查實例的健康狀況(通過心跳或健康檢查接口),標記實例是健康 (UP) 還是不健康 (DOWN)。服務消費者通常只選擇健康的實例。
- Cluster Name (集群名稱): 實例所屬的邏輯集群。
- Enabled (是否啟用): 可以手動控制實例是否參與服務發現。
- Ephemeral (是否臨時實例): 臨時實例通常依賴客戶端心跳維持,斷開連接后會被自動摘除;持久化實例則需要手動注冊和注銷。
- Metadata (自定義元數據): 可以附加鍵值對形式的自定義信息,用于更精細的服務治理,如版本號、環境標簽、灰度標記等。
- 注冊: 服務提供者啟動時,會將自己的 Instance 信息注冊到 Nacos Server 的對應 Service 下。
-
Cluster (集群):
- 定義: 服務 (Service) 下的邏輯劃分單元。一個 Service 可以包含一個或多個 Cluster。
- 作用:
- 邏輯隔離/分組: 將同一個 Service 的實例按照某種邏輯(如部署地域、機房、環境標簽、版本等)劃分到不同的 Cluster 中。
- 流量導向/負載均衡策略: 服務消費者可以根據需要,選擇性地只訪問特定 Cluster 下的實例,實現如地域就近訪問、同機房優先調用、灰度發布(將少量流量導向新版本實例所在的 Cluster)等。
- 歸屬: 每個 Instance 在注冊時必須屬于某個特定的 Cluster。如果注冊時不指定,通常會歸屬到一個默認的 Cluster (例如名為
DEFAULT
的 Cluster)。
Service, Instance, Cluster 之間的關系
這三者是 Nacos 服務發現模型中最核心的關聯概念:
-
Service 是抽象,Instance 是實現:
Service
是一個邏輯概念,代表一種服務能力(如 “訂單處理能力”)。Instance
是提供這種服務能力的具體、物理運行的單元(如運行在192.168.1.100:8080
上的訂單服務進程)。- 一個
Service
包含一個或多個Instance
。這些 Instance 共同對外提供Service
所定義的功能,實現了服務的高可用和負載均衡。
-
Cluster 是 Service 內部的邏輯分組:
Cluster
是對Service
內部Instance
的進一步邏輯劃分。它屬于某個Service
。- 一個
Service
可以包含一個或多個Cluster
。 - 一個
Instance
必須屬于其注冊Service
下的某一個Cluster
。 總結:
- 清晰的服務注冊: 服務提供者知道需要注冊到哪個 Namespace、哪個 Group 下的哪個 Service,并指定自己屬于哪個 Cluster。
- 靈活的服務發現: 服務消費者可以指定要發現哪個 Namespace、哪個 Group 下的哪個 Service,并且可以選擇性地只獲取特定 Cluster 下的健康實例,或者根據權重、元數據進行更復雜的篩選和負載均衡。
- 強大的服務治理: 基于 Cluster 和 Instance 的元數據,可以實現復雜的流量調度策略,如藍綠發布、金絲雀發布(灰度發布)、地域路由等。