nacos怎么修改服務分組_Nacos(六):多環境下如何“管理”及“隔離”配置和服務...

前言

前景回顧:

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

我們來說算一算,假設某系統有10個微服務,那么至少有10個配置文件吧,三個環境(devtestprod),那就有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.yml和nacos-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.name、namespace和group

啟動工程

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

現在我們有2個項目:nacos-namespace-one和nacos-namespace-two

2個項目分別有兩個不同的環境dev和test

此時觀察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來隔離不同的環境(devtest),在具體的環境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來隔離租戶,分別為zhangsan、lisi

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

啟動項目

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

此時兩個項目分別啟動兩個環境后,注冊到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-one和namespace-two卻沒有生效

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

但是不要擔心,Nacos的社區極度活躍,社區的大佬們也發現了這一情況,并且在Nacos-client的源碼中可以看到NameingService在加載配置文件時是有預留Group這一屬性字段的。

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

總結

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

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

單租戶方案(方案1):適合小型項目,服務數量不多時,方案一完全夠用

多租戶方案(方案2):適合項目量多,有一定的團隊規模,且服務數量較多時,可以相對條理清晰的管理和隔離配置及服務。

參考與感謝

版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 4.0 許可協議。轉載請注明來自 LarsCheng's Blog!

---

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394081.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394081.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394081.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Hive_Hive的數據模型_內部表

Hive的數據模型_內部表 - 與數據庫中的Table在概念上是類似。- 每一個Table在Hive中都有一個相應的目錄存儲數據。- 所有的Table數據(不包括External Table)都保存在這個目錄中。 create table t1 (tid int, tname string, age int);create table t2 (tid int, tname string, a…

為啥JAVA虛擬機不開發系統_理解Java虛擬機體系結構

1 概述眾所周知,Java支持平臺無關性、安全性和網絡移動性。而Java平臺由Java虛擬機和Java核心類所構成,它為純Java程序提供了統一的編程接口,而不管下層操作系統是什么。正是得益于Java虛擬機,它號稱的“一次編譯,到處…

Android WindowManager和WindowManager.LayoutParams的使用以及實現懸浮窗口的方法

1.理清概念 我們使用過Dialog和PopupWindow,還有Toast,它們都顯示在Activity之上。那么我們首先需要理解的是android中是如何去繪制這些UI的呢?這里我只講我所理解的,首先看一層次圖(盜用網絡)首先我們看到左邊的Activity層&#…

leetcode面試題 04.03. 特定深度節點鏈表(bfs)

給定一棵二叉樹,設計一個算法,創建含有某一深度上所有節點的鏈表(比如,若一棵樹的深度為 D,則會創建出 D 個鏈表)。返回一個包含所有深度的鏈表的數組。示例:輸入:[1,2,3,4,5,null,7…

Java集合中的細節

integer數據對比 對于Integer var ? 在-128至127范圍內的賦值,Integer對象是在IntegerCache.cache產生,會復用已有對象,這個區間內的Integer值可以直接使用進行判斷,但是這個區間之外的所有數據,都會在堆上產生&…

css擴展語言_如何決定是否應該鏈接或擴展CSS類

css擴展語言by Sarah Dayan通過莎拉達揚 如何決定是否應該鏈接或擴展CSS類 (How to decide whether you should chain or extend CSS classes) If you’re building an app or a website that changes often, modular CSS methods solve many issues. Instead of copying your…

vue 是否有word編輯控件_GitHub - C84882428/editor-ui: vue集成 tinymce 富文本編輯器,增加導入 word 模板...

editor-uivue 集成 tinymce 富文本編輯器自定義 tinymce 富文本編輯器,在原來的編輯器中增加上傳 word 模板最終展示效果:主要代碼:整體思路:1,在編輯器原來的基礎上增加上傳模板按鈕2, 前端上傳 word 模板3, 服務端接收將 word 轉換為html 返回前端4, 前端拿到服務端返回的值,…

Android開發系列之屏幕密度和單位轉換

由于Android的開源性,所以目前市面上面Android手機的分辨率特別多,這樣的話就給我適配帶來了一定的難度。要想做好適配,我們首先應該明白什么是分辨率、PPI、屏幕大小等概念,還有在不同的屏幕密度下,各個單位之間的轉換…

java集合AbstractMap_Java 集合中的 AbstractMap 抽象類

Java 集合中的 AbstractMap 抽象類jdk1.8.0_144AbstractMap 抽象類實現了一些簡單且通用的方法, 本身并不難但在這個抽象類中有兩個方法非常值得關注, keySet 和 values 方法源碼的實現可以說是教科書式的典范抽象類通常作為一種骨架實現, 為各自子類實現公共的方法上一篇我們講…

leetcode392. 判斷子序列(動態規劃)

給定字符串 s 和 t &#xff0c;判斷 s 是否為 t 的子序列。 你可以認為 s 和 t 中僅包含英文小寫字母。字符串 t 可能會很長&#xff08;長度 ~ 500,000&#xff09;&#xff0c;而 s 是個短字符串&#xff08;長度 <100&#xff09;。 字符串的一個子序列是原始字符串刪…

讓機器讀懂用戶——大數據中的用戶畫像

讓機器讀懂用戶——大數據中的用戶畫像 摘要&#xff1a; 用戶畫像(persona)的概念最早由交互設計之父Alan Cooper提出:“Personas are a concrete representation of target users.” 是指真實用戶的虛擬代表&#xff0c;是建立在一系列屬性數據之上的目標用戶模型。隨著互聯…

asp.net應用程序_如何在ASP.NET中為聊天應用程序構建鍵入指示器

asp.net應用程序by Neo Ighodaro由新Ighodaro 如何在ASP.NET中為聊天應用程序構建鍵入指示器 (How to build a typing indicator for your chat app in ASP.NET) A basic understanding of ASP.NET and jQuery is needed to follow this tutorial.要學習本教程&#xff0c;需要…

activeMQ在文件上傳的應用

本次試驗主要用到了activeMq和上傳插件uploadify的知識&#xff0c;感謝以下兩篇文章的作者。 1.http://itindex.net/detail/47160-java-jquery-%E4%B8%8A%E4%BC%A0 2.http://blog.csdn.net/jiuqiyuliang/article/details/47160259 本文中不再提供activeMq和uploadify的介紹。 …

java nginx 例子_Java及nginx實現文件權限控制代碼實例

我們知道&#xff0c;使用nginx作為文件下載服務器&#xff0c;可以極大地降低對后端Java服務器的負載沖擊&#xff0c;但是nginx本身并不提供授權控制&#xff0c;因此好的方案是由后端服務器實現權限控制&#xff0c;最好的方式是直接復用應用的認證體系&#xff0c;最大化的…

leetcode934. 最短的橋(dfs+bfs)

在給定的二維二進制數組 A 中&#xff0c;存在兩座島。&#xff08;島是由四面相連的 1 形成的一個最大組。&#xff09; 現在&#xff0c;我們可以將 0 變為 1&#xff0c;以使兩座島連接起來&#xff0c;變成一座島。 返回必須翻轉的 0 的最小數目。&#xff08;可以保證答…

謝煙客---------Linux之DNS服務系統的基礎知識

DNS Domain Name Server1)C/S架構&#xff1a;SOCKET通信IP PORT2&#xff09;應用層協議&#xff1a;資源子網BIND Berkerley Information Name DomainDNS由來1&#xff09;統一名字&#xff0c;自己維護 <自己查詢>解析: 基于key查找value: 查詢數據庫(二維關系的表: …

Java實現點擊導出excel頁面遮罩屏蔽,下載完成后解除遮罩

一、問題場景 最近在做數據統計功能&#xff0c;需求是導出大數據量的excel&#xff0c;時間間隔較長&#xff0c;大概需要十秒左右&#xff0c;點擊導出后&#xff0c;頁面沒有做任何處理&#xff0c;用戶也不知道是否正在導出&#xff1b;如果沒有做交互上的限制&#xff0c;…

pbs 支持 java_Linux下Java安裝與配置

安裝以JDK1.6.0_43為例下載jdk-6u43-linux-x64.bin&#xff0c;http://www.oracle.com/technetwork/java/javase/downloads/index.html增加可執行權限 chmod x jdk-6u43-linux-x64.bin&#xff0c;執行 ./jdk-6u43-linux-x64.bin 生成目錄jdk1.6.0_43拷貝到/usr/share下&#x…

使用Chatkit構建Node.js命令行聊天應用程序

by Hugo雨果 使用Chatkit構建Node.js命令行聊天應用程序 (Build a Node.js command-line chat application with Chatkit) Building chat in your app can be pretty complex. Yet, with Chatkit, implementing fully-featured chat is nothing but a few lines of code.在您的…

java 毫秒轉分鐘和秒_Java程序將毫秒轉換為分鐘和秒

Java程序將毫秒轉換為分鐘和秒在上面的程序中&#xff0c;您將學習如何在Java中將毫秒分別轉換為分鐘和秒。示例1&#xff1a;將毫秒分別轉換為分鐘和秒import java.util.concurrent.TimeUnit;public class Milliseconds {public static void main(String[] args) {long millis…