一、Nacos 配置中心核心屬性
? ? ? ?在學習nacos 作為配置中心的使用之前,先看下Nacos 作為配置中心時的三個屬性,即:
? ? ? ?命名空間、配置分組、配置集ID(習慣稱為配置文件ID);在使用Nacos 作為配置中心
? ? ? ?的過程中可以通過這3個屬性對配置文件進行隔離。
? ? ? ?在項目中通常通過 命名空間、配置分組和 Data ID 來唯一確定要使用的配置文件。
1、命名空間(Namespace )
? ? ??用于進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的
? ? ? 配置文件。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境
? ? ? 和生產環境的資源(如配置、服務)隔離等。
2、配置分組(Group)
? ? ?Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade
? ? ?)對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,
? ? ?如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP 。配置分組的常
? ? ?見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
3、配置集ID(Data ID)
? ? ?Nacos 中的某個配置集的 ID。配置集 ID 是組織劃分配置的維度之一。
? ? ?Data ID 通常用于組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集
? ? ?都可以被一個有意義的名稱標識。? ? ?
? ? ?配置集:一組相關或者不相關的配置項的集合稱為配置集。在系統中,一個配置文件通常就是
? ? ?一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了數據源、線程池、
? ? ?日志級別等配置項。
? ? ?Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全局
? ? ?唯一性。?此命名規則非強制。在實際工作中 Data ID 的命名一般遵守下面的格式:
? ? ? ? ? ??${prefix}-${spring.profiles.active}.${file-extension}
? ? ?解釋:
? ? ? ? ? prefix:Nacos配置文件的前綴,默認是 “spring.application.name” 的值,也可以通過
? ? ? ? ? ? ? ? ? ? ? nacos配置項 “spring.cloud.nacos.config.prefix” 來配置
? ? ? ? ??spring.profiles.active:即為當前環境對應的 profile,
? ? ? ? ? ? ? ? ? ? ? 注意:當 “spring.profiles.active”?為空時,對應的連接符 “-” 也將不存在,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?dataId 的拼接格式變成 “${prefix}.${file-extension}”
? ? ? ? ??file-exetension:為配置文件的格式,可以通過配置項
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? “spring.cloud.nacos.config.file-extension”?來配置。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?目前只支持 “properties”?和 “yaml”?類型。
4、Namespace、Group 和 Data ID 三者之間的關系?
? ? ?Namespace、Group 和 Data ID 這三者之間類似于Java里面的package名和類名,最外層的
? ? ?Namespace是可以用于區分部署環境的,Group和DataID邏輯上區分兩個目標對象;
? ? ?如下圖所示:
? ? ? ? ? ??
? ? ?Nacos默認的命名空間是public,我們就可以利用Namespace來實現隔離,比如我們現在有三
? ? ?個環境:開發、測試、生產環境,我們就可以創建三個Namespace,不同的Namespace之
? ? ?間是隔離的。
? ? ?Group本身就是分組的意思,它可以把不同的微服務劃分到同一個分組里面去。Group 默認
? ? ?是?DEFAULT_GROUP
? ? ?剩下的就是具體微服務,一個Service可以包含多個Cluster,Nacos默認Cluster是DEFAULT,
? ? ?Cluster是對指定微服務的一個虛擬劃分。比如說,將一個Service部署在北京和和上海的機房
? ? ?中,北京機房的Service就可以起名為(BJ),杭州機房中的Service就可以起名為(SH),
? ? ? 這樣就可以盡量讓同一個機房的微服務互相調用,提升性能。
? ? ?通過?Namespace、Group 和 Data ID 可以實現配置文件的隔離和動態切換
二、Nacos 作為配置中心使用步驟
1、引入 Nacos Config 依賴,
2、在項目的配置文件中配置Nacos 配置中心地址、配置文件類型以及“spring.profiles.active”,
? ? ?“spring.profiles.active” 是為了后邊Data ID 的取值。
? ? ? 注意:在springBoot 項目中我們常用的配置文件是application.yml,但配置文件application的
? ? ? ? ? ? ? ? ?優先級比較低;但項目啟動初始化時就需要拉取配置,若將nacos 配置中心信息配置在
? ? ? ? ? ? ? ? ?application中,此時可能會出現application還沒開始執行配置獲取不到而導致項目啟動
? ? ? ? ? ? ? ? ?報錯,所以我們需要把Nacos 配置中心信息配置到比application優先級更高的配置文件
? ? ? ? ? ? ? ? ?bootstrap.yml;
? ? ? ? ? ? ? ? ?nacos 作為配置中心時一般需要2個配置文件,即:bootstrap.yml、?application.yml;
? ? ? ? ? ? ? ? ?bootstrap.yml 用于去Nacos中讀取指定后綴為yaml的配置文件,application.yml 用于
? ? ? ? ? ? ? ? ?配置其他信息,如配置:spring.profiles.active
? ? ? 配置內容如下:
server:port: 3377
#配置文件的加載的優先級 boootstrap.yml 高于 application,
#項目需要先拉取配置才能正常啟動,所以 nacos 作為配置中心的配置最好放在 boootstrap 文件中
spring:application:name: nacos-config-clientcloud:#配置nacosnacos:#配置 “nacos配置中心”config:server-addr: 47.117.80.49:8848file-extension: yaml #指定拉取的配置文件的后綴
? ? ? ? ??
? ? ? ? ??
4、在Nacos 平臺創建配置文件
? ? ?在瀏覽器訪問 http://localhost:8848/nacos 進入Nacos 平臺,進入“配置管理—>配置列表”
? ? ?頁面來創建配置文件,如下圖所示:
? ? ? ? ? ?
? ? ?通過上邊介紹Data ID 命名規則 與 當前項目中的配置項?“spring.application.name
? (nacos-config-client)”、?“spring.profiles.active(dev)” 、“file-extension” 可以推導
? ? 出當前配置文件的Data ID 應該是 “nacos-config-client-dev.yaml”,推到過程如下圖所示:
? ? ? ? ? ?
? ? 新建配置文件時,分組Group 默認是 “DEFAULT_GROUP”,但分組Group的值是可以修改的,
? ? 可以根據自己的要求來求改Group的值,不同的Group下允許Data ID 相同的配置文件;
? ? 配置內容如下:
? ? ? ? ? ?
5、測試,驗證Nacos 中的配置文件是否生效
? ? ? 創建測試類?ConfigController,通過spring 原生注解 @Value 將nacos 配置文件中的配置項
? ? ? 映射到屬性 configInfo 上。
? ? ? 注意:注解?@Value 不支持配置的動態刷新,但可以通過?@RefreshScope+@Value 的方式
? ? ? ? ? ? ? ? ?來實現配置的動態刷新;
? ? ? ? ? ? ? ? ?在高版本的spring cloud alibaba nacos config 中,nacos 原生注解 @NacosValue (動
? ? ? ? ? ? ? ? ?態獲取配置nacos配置文件值,支持動態刷新)不生效,官方支持使用spring cloud 原生
? ? ? ? ? ? ? ? ?注解 @Value+@RefreshScope 的方式實現配置的動態刷新
? ? ?測試代碼如下:
/***************************************************** 在通過主機@Value 把配置文件的配置項與類中的屬性綁定時,可以通過注解 @RefreshScope 實現配置的動態* 刷新** @author * @date 2025/6/16 15:06****************************************************/
@RefreshScope
@RestController
public class ConfigController {@Value("${config.info}")private String configInfo;/*** todo 注意:* 在高版本的spring cloud alibaba nacos config 中,nacos 原生注解 @NacosValue (動態獲取配置nacos配置文件值,支持動態刷新)* 不生效,官方支持使用spring cloud 原生注解 @Value+@RefreshScope 的方式實現配置的動態刷新*///@NacosValue(value = "${config.info}",autoRefreshed = true)private String config;@GetMapping("/config/info")public String test(){System.out.println(" config = "+config);System.out.println(" configInfo = "+configInfo);return this.configInfo;}
}
? ? ?測試結果:
? ? ? ? ? 在瀏覽器訪問?“http://localhost:3377/config/info”?,頁面成功打印
? ? ? ? ? “nacos-config-client-dev.yaml” 中的配置項,如下圖所示:
? ? ? ? ? ? ? ?
三、通過?Namespace、Group 和 Data ID 實現Nacos 配置文件的動態切換
1、通過Data ID 動態切換配置文件
? ? ? 根據前邊 Data ID 的命名規則我們知道,在該方案中一般是修改 “spring.profiles.active” 的
? ? ? 值來動態切換不同環境的配置文件
? ? ? 步驟:
? ? ? ? ? ? ? 1)在 public 命名空間下新增配置文件 “nacos-config-client-test.yaml”,并設置該配置文
? ? ? ? ? ? ? ? ? ?件的分組與 配置文件 “nacos-config-client-dev.yaml” 相同,即都是
? ? ? ? ? ? ? ? ? ?“DEFAULT_GROUP”,如下所示:
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 2)配置文件application.yml 中的配置項 “spring.profiles.active” 配置內容如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?nacos config 配置內容如下:
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? 3)測試
? ? ? ? ? ? ? ? ? ?通過修改配置文件application.yml 中的配置項 “spring.profiles.active” 來動態讀取不同
? ? ? ? ? ? ? ? ? ?環境的配置文件,
? ? ? ? ? ? ? ? ? ?2次訪問 “http://localhost:3377/config/info?”? 測試結果如下所示如下圖所示:
? ? ? ? ? ? ? ? ? ? (1)dev 開發環境
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? (2)test 測試環境
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
2、通過 Group 動態切換配置文件
? ? ?根據之前的講解我們都知道Group為分組默認是:DEFAULT_GROUP,所以現在我們就需要
? ? ?分出兩組,一組是“DEFAULT_GROUP”,一組是“DEFAULT_INFO”
? ? ?而且根據前邊的了解我們知道,Group分組只能在創建配置文件時指定。
? ? ?步驟:
? ? ? ? ? ?1)新創建 Data ID 為 “nacos-config-client-dev.yaml” 的配置文件,并指定該文件的所屬
? ? ? ? ? ? ? ? 分組是 “DEFAULT_INFO”,如下圖所示:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? 這樣在Nacos 配置列表中就存在2個DataID同為 “nacos-config-client-dev.yaml” 但分組
? ? ? ? ? ? ? ? 不一樣的配置文件,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?
? ? ? ? ? ?2)在配置文件?bootstrap.yml 中的 Nacos 配置中心的配置中增加配置項 “group”,
? ? ? ? ? ? ? ? ?group 表示讀取那個分組下的配置文件,group 若不配置則默認讀取 分組
? ? ? ? ? ? ? ? ?“DEFAULT_GROUP” 中的配置文件,配置內容如下:
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ?3)測試
? ? ? ? ? ? ? ? ?通過修改?配置文件?bootstrap.yml 中配置項 "group" 的值來觀察訪問
? ? ? ? ? ? ? ? ?“http://localhost:3377/config/info?”? 的輸出情況,測試結果如下:
? ? ? ? ? ? ? ? (1)DEFAULT_GROUP 分組測試結果:
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? (2)DEFAULT_INFO 分組測試結果
? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ?
3、通過 Namespace 動態切換配置文件
? ? ? 在Nacos 管理平臺,進入“命名空間”頁面,發現此時已經存在一個名稱為“public”的命名空間;
? ? ? public 是Nacos 默認的命名空間,不可編輯和刪除(自己創建的命名空間可以編輯和刪除);
? ? ? 如下圖所示:
? ? ? ? ? ? ??
? ? ? 驗證 “通過 Namespace 動態切換配置文件” 則需要至少2個命名空間,所以我們還需要先新建
? ? ? 一個命名空間
? ? ? 步驟:
? ? ? ? ? 1)新創建命名空間
? ? ? ? ? ? ? ? 在命名空間頁面,點擊按鈕“新建命名空間” 來創建命名空間,如下圖所示:
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? 2)在新加的命名空間 “DEV”中新增配置文件 “nacos-config-client-dev.yaml”,并設置分組
? ? ? ? ? ? ? ? Group 與 命名空間public 下的同 Data ID 的配置文件的分組一致,
? ? ? ? ? ?? ? 即分組Group=DEFAULT_GROUP,如下圖所示:
? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? 3)修改nacos 配置中心配置
? ? ? ? ? ? ? ??在配置文件?bootstrap.yml 中的 Nacos 配置中心的配置中增加配置項 “namespace”,
? ? ? ? ? ? ? ??namespace?指定配置文件所在的命名空間,若不配置,默認是Ncos 保留的命名
? ? ? ? ? ? ? ? 空間 public;在Nacos 中通過${namespace}.${group}.${dataId}.${文件格式}來唯一
? ? ? ? ? ? ? ? 確定配置文件,配置內容如下:
? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ??bootstrap.yml 中 的配置內容如下:? ? ? ? ??
server:port: 3377
#配置文件的加載的優先級 boootstrap.yml 高于 application,
#項目需要先拉取配置才能正常啟動,所以 nacos 作為配置中心的配置最好放在 boootstrap 文件中
spring:application:name: nacos-config-clientcloud:#配置nacosnacos:#配置 “nacos配置中心”config:server-addr: 47.117.80.49:8848file-extension: yaml #指定拉取的配置文件的后綴#指定配置文件的分組,若不配置默認是 DEFAULT_GROUP#不同的分組可以存在DataId 相同的配置文件group: DEFAULT_GROUP#group: DEFAULT_INFO#指定配置文件所在的命名空間,若不配置,默認是Ncos 保留的命名空間 public#${namespace}.${group}.${dataId}.${文件格式}來唯一確定配置文件namespace: 01edc802-425e-4c4e-828e-a28d079051ad#配置nacos 服務注冊中心discovery:server-addr: 47.117.80.49:8848
? ? ? ? ? 4)測試
? ? ? ? ? ? ? ??通過修改?配置文件?bootstrap.yml 中配置項 "namespace" 的值來觀察訪問
? ? ? ? ? ? ? ? ?“http://localhost:3377/config/info?”? 的輸出情況,測試結果如下:
? ? ? ? ? ? ? ? ?(1)默認命名空間public 測試結果
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ?(2)命名空間DEV 測試結果
? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?