[toc]
**推薦理由**
> 這篇博文很關鍵的一點是把nacos的管理分為單租戶和多租戶的概念,提出兩種環境隔離的思路。這樣把兩種管理方式做了很好的理論解釋,不至于在使用的時候左右為難。
# 一、前言
前景回顧:
- [Nacos(五):多環境下如何“讀取”Nacos中相應環境的配置](https://www.larscheng.com/config-profile/)
- [Nacos(四):SpringCloud項目中接入Nacos作為配置中心](https://www.larscheng.com/config-service/)
現如今,在微服務體系中,一個系統往往被拆分為多個服務,每個服務都有自己的配置文件,然后每個系統往往還會準備開發環境、測試環境、正式環境
我們來說算一算,假設某系統有10個微服務,那么至少有10個配置文件吧,三個環境(dev\test\prod),那就有30個配置文件需要進行管理。
這么多的配置文件,要修改一個或者多個的時候,稍有不慎可能就會出現改錯了、不生效…等等問題。
**那么如果引入Nacos作為配置中心后,如何有效的進行配置文件的管理和不同環境間的隔離區分呢?**
> 別擔心,Namespace可以幫助我們進行多環境下的管理和隔離
有了上一篇文章的介紹,本文主要從以下幾個方面介紹:
- Namespace是什么
- Namespace如何進行配置和服務的管理、隔離
- 創建和獲取NamespaceID
- Namespace實施方案1
- Namespace實施方案2
# 二、如何進行配置和服務的管理、隔離
## Namespace
Nacos引入了命名空間(Namespace)的概念來進行`多環境配置和服務`的管理及隔離
Namespace也是官方推薦的多環境支持方案。
當我們的服務達到一定的數量,集中式的管理許多服務會十分不便,
那我們可以將這些具有相同特征或屬性的服務進行分組管理,服務對應的配置也進行分組隔離
這里的`分組`就是`Namespace`的概念,將服務和配置納入相同的Namespace進行管理
不同Namespace下的服務和配置之間就隔離開來
## 創建和獲取NamespaceID
NamespaceId值是在配置文件配置時必須要填入的配置項,所以需要我們先創建Namespace和Id,步驟如下:
nacos 的控制臺左邊功能欄看到有一個`命名空間`的功能,點擊就可以看到`新建命名空間` 的按鈕
新建成功后,可以在命名空間列表中查看到你所創建的Namespace和他生成的ID值
這里只是講解創建步驟,本文繼續延用Nacos(五)中創建的`DEV、TEST`
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190723175908.png)
## Namespace實施方案1
Nacos給出了兩種Namespace的實踐方案
- 面向一個租戶
- 面向多個租戶
方案1主要說明一下面向一個租戶
從一個租戶(用戶)的角度來看,如果有多套不同的環境,那么這個時候可以根據指定的環境來創建不同的 namespce,以此來實現多環境的隔離。
例如,你可能有dev,test和prod三個不同的環境,那么使用一套 nacos 集群可以分別建以下三個不同的 namespace。如下圖所示:
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805163212.png)
這里的單租戶同樣也適于小型項目,或者是項目不太多時的實施方案
通過定義不同的環境,不同環境的項目在不同的Namespace下進行管理,不同環境之間通過Namespace進行隔離
當多個項目同時使用該Nacos集群時,還可以通過Group進行Namespace內的細化分組
這里以`Namespace:dev`為例,在Namespace中通過不同Group進行同一環境中不同項目的`再分類`
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805163727.png)
有了以上思路,我們通過代碼來實踐一下
## Namespace下新建配置文件
啟動Nacos-Server,進入Nacos控制臺,切換到Namespace:dev界面,新建配置文件
- DataId:`nacos-namespace-one-dev.yml`
- Group:`namespace-one`
- 配置格式:`YAML`
- 配置內容:
```
nacos:
config: 項目:nacos-namespace-one,Namespace:dev
```
繼續新建配置文件
- DataId:`nacos-namespace-two-dev.yml`
- Group:`namespace-two`
- 配置格式:`YAML`
- 配置內容:
```
nacos:
config: 項目:nacos-namespace-two,Namespace:dev
```
**切換到Namespace:test環境,按照dev中的創建方式,分別創建`nacos-namespace-one-test.yml`和`nacos-namespace-two-test.yml`**
> 注意檢查DataId是否正確、group、配置內容與環境是否匹配
## 創建項目
在聚合工程Nacos下創建名為`nacos-namespace-one`的子項目,該工程的依賴文件和啟動類的代碼與[Nacos(四)](https://www.larscheng.com/config-service/)完全一致。
> 以下NamespaceId均來自創建Namespace時生成的Id,在控制臺命名空間頁面中可以查看
創建dev環境配置文件`bootstrap-dev.yml`
```
server:
port: 9911
spring:
application:
name: nacos-namespace-one
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: edbd013b-b178-44f7-8caa-e73071e49c4d
group: namespace-one
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yml
namespace: edbd013b-b178-44f7-8caa-e73071e49c4d
group: namespace-one
```
創建test環境配置文件`bootstrap-dev.yml`
```
server:
port: 9912
spring:
application:
name: nacos-namespace-one
profiles:
active: test
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 0133bd1e-25c3-4985-96ed-a4e34efdea2e
group: namespace-one
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yml
namespace: 0133bd1e-25c3-4985-96ed-a4e34efdea2e
group: namespace-one
```
**重復以上操作,再創建一個名為`nacos-namespace-two`的子項目**
> nacos-namespace-two項目的dev和test啟動端口分別設置為9921和9922,group為:namespace-two
> 記得修改`spring.application.name`、`namespace`和`group`
## 啟動工程
分別啟動兩個項目的兩個環境(四個啟動類),如下圖
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805185416.png)
現在我們有2個項目:`nacos-namespace-one`和`nacos-namespace-two`
2個項目分別有兩個不同的環境`dev`和`test`
此時觀察Nacos-Server控制臺如下:
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/namespace1.gif)
嘗試訪問接口來獲取配置信息,驗證是否可以讀取相應環境配置
```
訪問127.0.0.1:9911/getValue,返回:項目:nacos-namespace-one,Namespace:dev
訪問127.0.0.1:9912/getValue,返回:項目:nacos-namespace-one,Namespace:test
訪問127.0.0.1:9921/getValue,返回:項目:nacos-namespace-two,Namespace:dev
訪問127.0.0.1:9922/getValue,返回:項目:nacos-namespace-two,Namespace:test
```
通過以上實驗,方案1可以達到多環境多項目下的服務、配置管理的目標
> 方案1通過Namespace來隔離不同的環境(dev\test),在具體的環境Namespace中通過Group來管理不同的項目
## Namespace實施方案2
了解了單租戶的方案1,再來看看Nacos推薦的面向多租戶的方案2
從多個租戶(用戶)的角度來看,每個租戶(用戶)可能會有自己的 namespace,每個租戶(用戶)的配置數據以及注冊的服務數據都會歸屬到自己的 namespace 下,以此來實現多租戶間的數據隔離。
例如超級管理員分配了三個租戶,分別為張三、李四和王五。張三負責A項目,李四負責B項目,王五負責C項目
分配好了之后,各租戶用自己的賬戶名和密碼登錄后,創建自己的命名空間。如下圖所示:
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805194232.png)
> 方案2通過Namespace來隔離多租戶之間的服務和配置,但不僅于此,他有很好的擴展性
在該方案中,Group同樣也有用武之地。
**需求改變下**,公司發展迅速業務調整,張三負責A項目、B項目、C項目,李四負責D項目、E項目、F項目,王五負責G項目、H項目、I項目,
而每個項目又分了dev、test、prod三個環境,繼續沿用之前的Namespace隔離租戶方案,顯得有些管理不便,這時候可以在NameSpace中加入Group進行項目環境分組,如圖:
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805193836.png)
但是當業務規模更大的時候(不考慮Nacos集群能否支持的因素),張三、李四、王五每人都負責10多個項目時,即`項目數>環境數`時,可以通過Group進行項目分組,如下圖:
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805194131.png)
通過上面的理論分析,可以看出方案二有很好的擴展性
依舊如上,我們通過代碼來實踐一下方案2(Namespace隔離租戶 + group環境分組)
## 場景描述
依舊使用上面的兩個項目,假設現在有兩個租戶,張三、李四
張三負責項目:`nacos-namespace-one`, 李四負責項目:`nacos-namespace-two`,項目分別有dev和test環境
## 新建Namespace和配置文件
新建兩個Namespace來隔離租戶,分別為`zhangsan`、`lisi`
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805195206.png)
在Namespace:zhangsan 下創建配置文件
- DataId:`nacos-namespace-one-dev.yml`
- Group:`namespace-one-dev`
- 配置格式:`YAML`
- 配置內容:
```
nacos:
config: 項目:nacos-namespace-one,Namespace:張三,環境:dev
```
繼續創建test環境配置文件
- DataId:`nacos-namespace-one-test.yml`
- Group:`namespace-one-test`
- 配置格式:`YAML`
- 配置內容:
```
nacos:
config: 項目:nacos-namespace-one,Namespace:張三,環境:test
```
參照以上操作,在Namespace:lisi命名空間中創建配置文件`nacos-namespace-two-dev.yml`和`nacos-namespace-two-test.yml`
> 注意核對DataId、Group、和配置內容
## 修改項目的配置文件bootstrap.yml
修改項目nacos-namespace-one的dev配置文件`bootstrap-dev.yml`
```
server:
port: 9911
spring:
application:
name: nacos-namespace-one
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 方案2:NamespaceID\Group
namespace: e0d75068-a12c-4314-9296-3f396139d5b3
group: namespace-one-dev
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yml
# 方案2:NamespaceID\Group
namespace: e0d75068-a12c-4314-9296-3f396139d5b3
group: namespace-one-dev
```
修改test配置文件`bootstrap-test.yml`
```
server:
port: 9912
spring:
application:
name: nacos-namespace-one
profiles:
active: test
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 方案2:NamespaceID\Group
namespace: e0d75068-a12c-4314-9296-3f396139d5b3
group: namespace-one-test
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yml
# 方案2:NamespaceID\Group
namespace: e0d75068-a12c-4314-9296-3f396139d5b3
group: namespace-one-test
```
> 重復以上操作相應的修改項目nacos-namespace-two的dev和test配置文件
> 主要修改namespace和group屬性,與命名空間lisi的ID和其下配置文件的Group對應
## 啟動項目
分別啟動兩個項目的兩個環境(四個啟動類),啟動成功如下圖
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190805185416.png)
此時兩個項目分別啟動兩個環境后,注冊到Nacos上不同的Namespace下,并讀取相應環境的配置,具體如下:
nacos-namespace-one
- dev: 注冊到Namespace:zhangsan,讀取Namespace:zhangsan下Group:namespace-one-dev的配置
- test: 注冊到Namespace:zhangsan,讀取Namespace:zhangsan下Group:namespace-one-test的配置
nacos-namespace-two
- dev: 注冊到Namespace:lisi,讀取Namespace:lisi下Group:namespace-two-dev的配置
- test: 注冊到Namespace:lisi,讀取Namespace:lisi下Group:namespace-two-test的配置
此時Nacos控制臺如下圖:
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/namespace2.gif)
ok我們來測試下各個環境的服務能否訪問到對應的配置
```
訪問127.0.0.1:9911/getValue,返回:項目:nacos-namespace-one,Namespace:張三,環境:dev
訪問127.0.0.1:9912/getValue,返回:項目:nacos-namespace-one,Namespace:張三,環境:test
訪問127.0.0.1:9921/getValue,返回:項目:nacos-namespace-two,Namespace:李四,環境:dev
訪問127.0.0.1:9922/getValue,返回:項目:nacos-namespace-two,Namespace:李四,環境:test
```
通過訪問服務的接口,各個服務都可以準確的讀取到各自環境下的配置文件
> 方案二可以看到同樣支持服務和配置的隔離分組,同時支持業務的擴展,有較好的擴展性
# 三、問題描述
但是相信大家已經發現了一個問題,當使用的Group來進行分組后,配置文件相互之間可以實現不同環境與不同項目之間的分組隔離
但是服務注冊后,雖然可以通過Namespace隔離,但指定的Group分組卻并沒有生效,依然是`DEFAULT_GROUP`
比如方案1 所有項目啟動后Nacos服務列表頁如下圖
[](https://cdn.jsdelivr.net/gh/larscheng/myImg//blogImg/Nacos/20190806145037.png)
這里本應該是我們自定義的分組`namespace-one`和`namespace-two`卻沒有生效
由此發現,配置之間是達到了相互分組隔離名但`服務列表暫時并不支持`。
> 但是不要擔心,Nacos的社區極度活躍,社區的大佬們也發現了這一情況,并且在Nacos-client的源碼中可以看到NameingService在加載配置文件時是有預留`Group`這一屬性字段的。
所以既然Nacos提供了這一實踐方案,正常使用只不過是時間問題。
# 四、總結
以上分析了Nacos對于Namespace提供的兩種實踐方案,同時進行了代碼實驗,均達到了預期的要求。
現對兩種方案進行一個總結
- 單租戶方案(方案1):適合小型項目,服務數量不多時,方案一完全夠用
- 多租戶方案(方案2):適合項目量多,有一定的團隊規模,且服務數量較多時,可以相對條理清晰的管理和隔離配置及服務。
**本文源碼**:https://github.com/larscheng/larscheng-learning-demo/tree/master/Nacos**
[Namespace最佳實踐](https://nacos.io/zh-cn/docs/namespace-endpoint-best-practices.html)
>文章作者: LarsCheng
文章鏈接: https://www.larscheng.com/nacos-namespace/
版權聲明: 本博客所有文章除特別聲明外,均采用CC BY-NC-ND 4.0, 轉載請注明來自 LarsCheng!
- 簡介
- 更新說明
- 其他作品
- 第一部分 Java框架基礎
- 第一章 Java基礎
- 多線程實戰
- 嘗試一下Guava帶返回值的多線程處理類ListenableFuture
- LocalDate和Date有什么區別
- JAVA8接口增強實踐
- 第二章 Spring框架基礎
- MVC究竟是個啥?
- @ApiImplicitParam
- 七種方式,教你在SpringBoot初始化時搞點事情!
- Spring事務狀態
- maven
- Mybatis小總結
- mybatis-plus的使用
- 第三章 SpringSecurity實戰
- 基于SpringSecurity+jwt的用戶認證
- spring-security-oauth2
- 第四章 數據庫
- mysql
- mysql授權
- mysql數據庫三個關鍵性能指標--TPS\QPS\IOPS
- 梳理一下那些年Mysql的弱語法可能會踩的坑
- 關于Mysql的“字符串”數值的轉換和使用
- 憑這一文咱把事務講透
- Mysql性能優化
- 查詢性能優化
- 不常用的一些語法
- elasticsearch
- elasticsearch文檔操作
- 索引的基本操作
- java操作ElaticSearch
- elasticsearch中的各種查詢
- DB與ES混合應用可能存在的問題及解決方案探索
- 使用es必須要知道的一些知識點:索引篇
- Es中的日期操作
- MongoDB
- 入門篇(了解非關系型數據庫 NoSQL - MongoDB)
- 集群分片 (高級篇)
- 互聯網大廠的建表規范
- 第五章 中間件
- nginx
- nginx動靜分離配置,這個雷你踩過嗎?
- Canal
- Sharding-jdbc
- 水平分庫實踐
- kafka
- 第六章 版本管理
- git
- Not currently on any branch 情況提交版本
- 第七章 IO編程
- 第八章 JVM實戰調優
- jvisualvm
- jstat
- 第二部分 高級項目實戰篇
- 第一章 微信開發實戰
- 第二章 文件處理
- 使用EasyExcel處理導入導出
- 第三章 踩坑指南
- 郵件發送功能
- 第三部分 架構實戰篇
- 第一章 架構實戰原則
- 接口防止重復調用的一種方案
- 第二章 高并發緩存一致性管理辦法
- 第三章 異地多活場景下的數據同步之道
- 第四章 用戶體系
- 集成登錄
- auth-sso的管理
- 第五章 分庫分表場景
- 第六章 秒殺與高并發
- 秒殺場景
- 第七章 業務中臺
- 中臺的使用效果是怎樣的?
- 通用黑白名單方案
- 第八章 領域驅動設計
- 第十一章 微服務實戰
- Nacos多環境管理之道
- logback日志雙寫問題及Springboot項目正確的啟動方式
- 第四部分 優雅的代碼
- java中的鏈式編程
- 面向對象
- 開發原則
- Stream操作案例分享
- 注重性能的代碼
- 第五部分 談談成長
- 新手入門指北
- 不可不知的調試技巧
- 構建自己的知識體系
- 我是如何做筆記的
- 有效的提問
- 謹防思維定勢
- 學會與上級溝通
- 想清楚再去做
- 碎片化學習
- 第六部分 思維導圖(付費)
- 技術基礎篇
- 技術框架篇
- 數據存儲篇
- 項目實戰篇
- 第七部分 吾愛開源
- 7-1 麻雀聊天
- 項目啟動
- 前端登錄無請求問題解決
- websocket測試
- 7-2 ocp微服務框架
- evm框架集成
- 項目構建與集成
- zentao-center
- 二次開發:初始框架的搭建
- 二次開發:增加細分菜單、權限到應用
- 7-3 書棧網
- 項目啟動
- 源碼分析
- 我的書架
- 文章發布機制
- IM
- 第八章 團隊管理篇
- 大廠是怎么運作的
- 第九章 碼山有道
- 簡歷內推
- 聯系我內推
- 第十章 學點前端
- Vue