1. 程式人生 > >Nacos(六):多環境下如何“管理”及“隔離”配置和服務

Nacos(六):多環境下如何“管理”及“隔離”配置和服務

前言

前景回顧:

  • Nacos(五):多環境下如何“讀取”Nacos中相應環境的配置
  • Nacos(四):SpringCloud專案中接入Nacos作為配置中心

現如今,在微服務體系中,一個系統往往被拆分為多個服務,每個服務都有自己的配置檔案,然後每個系統往往還會準備開發環境、測試環境、正式環境

我們來說算一算,假設某系統有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

Namespace實施方案1

Nacos給出了兩種Namespace的實踐方案

  • 面向一個租戶
  • 面向多個租戶

方案1主要說明一下面向一個租戶

從一個租戶(使用者)的角度來看,如果有多套不同的環境,那麼這個時候可以根據指定的環境來建立不同的 namespce,以此來實現多環境的隔離。

例如,你可能有dev,test和prod三個不同的環境,那麼使用一套 nacos 叢集可以分別建以下三個不同的 namespace。如下圖所示:

這裡的單租戶同樣也適於小型專案,或者是專案不太多時的實施方案

通過定義不同的環境,不同環境的專案在不同的Namespace下進行管理,不同環境之間通過Namespace進行隔離

當多個專案同時使用該Nacos叢集時,還可以通過Group進行Namespace內的細化分組

這裡以Namespace:dev為例,在Namespace中通過不同Group進行同一環境中不同專案的再分類

有了以上思路,我們通過程式碼來實踐一下

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.ymlnacos-namespace-two-test.yml

注意檢查DataId是否正確、group、配置內容與環境是否匹配

建立專案

在聚合工程Nacos下建立名為nacos-namespace-one的子專案,該工程的依賴檔案和啟動類的程式碼與Nacos(四)完全一致。

以下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.namenamespacegroup

啟動工程

分別啟動兩個專案的兩個環境(四個啟動類),如下圖

現在我們有2個專案:nacos-namespace-onenacos-namespace-two

2個專案分別有兩個不同的環境devtest

此時觀察Nacos-Server控制檯如下:

嘗試訪問介面來獲取配置資訊,驗證是否可以讀取相應環境配置

訪問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專案

分配好了之後,各租戶用自己的賬戶名和密碼登入後,建立自己的名稱空間。如下圖所示:

方案2通過Namespace來隔離多租戶之間的服務和配置,但不僅於此,他有很好的擴充套件性

在該方案中,Group同樣也有用武之地。

需求改變下,公司發展迅速業務調整,張三負責A專案、B專案、C專案,李四負責D專案、E專案、F專案,王五負責G專案、H專案、I專案,

而每個專案又分了dev、test、prod三個環境,繼續沿用之前的Namespace隔離租戶方案,顯得有些管理不便,這時候可以在NameSpace中加入Group進行專案環境分組,如圖:

但是當業務規模更大的時候(不考慮Nacos叢集能否支援的因素),張三、李四、王五每人都負責10多個專案時,即專案數>環境數時,可以通過Group進行專案分組,如下圖:

通過上面的理論分析,可以看出方案二有很好的擴充套件性

依舊如上,我們通過程式碼來實踐一下方案2(Namespace隔離租戶 + group環境分組)

場景描述

依舊使用上面的兩個專案,假設現在有兩個租戶,張三、李四

張三負責專案:nacos-namespace-one, 李四負責專案:nacos-namespace-two,專案分別有dev和test環境

新建Namespace和配置檔案

新建兩個Namespace來隔離租戶,分別為zhangsanlisi

在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.ymlnacos-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對應

啟動專案

分別啟動兩個專案的兩個環境(四個啟動類),啟動成功如下圖

此時兩個專案分別啟動兩個環境後,註冊到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控制檯如下圖:

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服務列表頁如下圖

這裡本應該是我們自定義的分組namespace-onenamespace-two卻沒有生效

由此發現,配置之間是達到了相互分組隔離名但服務列表暫時並不支援

但是不要擔心,Nacos的社群極度活躍,社群的大佬們也發現了這一情況,並且在Nacos-client的原始碼中可以看到NameingService在載入配置檔案時是有預留Group這一屬性欄位的。

所以既然Nacos提供了這一實踐方案,正常使用只不過是時間問題。

總結

以上分析了Nacos對於Namespace提供的兩種實踐方案,同時進行了程式碼實驗,均達到了預期的要求。

現對兩種方案進行一個總結

  • 單租戶方案(方案1):適合小型專案,服務數量不多時,方案一完全夠用
  • 多租戶方案(方案2):適合專案量多,有一定的團隊規模,且服務數量較多時,可以相對條理清晰的管理和隔離配置及服務。

本文原始碼:https://github.com/larscheng/larscheng-learning-demo/tree/master/Nacos

參考與感謝

Namespace最佳實踐


  • 文章作者: LarsCheng
  • 文章連結: 本文首發於個人部落格:https://www.larscheng.com/nacos-namespace/
  • 釋出方式:OpenWrite 最懂你的科技自媒體管理平臺
  • 版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 LarsCheng's Blog!