Nacos配置中心用法详细介绍
????????上篇文章介紹了 Nacos 作為注冊中心的用法,除此之外,Nacos 還能作為配置中心使用,那這篇文章就介紹下 Nacos 作為配置中心的基本用法,首先我們先了解下為什么需要使用配置中心。
一、為什么需要配置中心:
在沒有配置中心之前,傳統應用配置的存在以下痛點:
(1)采用本地靜態配置,無法保證實時性:修改配置不靈活且需要經過較長的測試發布周期,無法盡快通知到客戶端,還有些配置對實時性要求很高,比方說主備切換配置或者碰上故障需要修改配置,這時通過傳統的靜態配置或者重新發布的方式去配置,那么響應速度是非常慢的,業務風險非常大
(2)易引發生產事故:比如在發布的時候,容易將測試環境的配置帶到生產上,引發生產事故。
(3)配置散亂且格式不標準:有的用properties格式,有的用xml格式,還有的存DB,團隊傾向自造輪子,做法五花八門。
(4)配置缺乏安全審計、版本控制、配置權限控制功能:誰?在什么時間?修改了什么配置?無從追溯,出了問題也無法及時回滾到上一個版本;無法對配置的變更發布進行認證授權,所有人都能修改和發布配置。
????????而配置中心區別于傳統的配置信息分散到系統各個角落的方式,對系統中的配置文件進行集中統一管理,而不需要逐一對單個的服務器進行管理。那這樣做有什么好處呢?
(1)通過配置中心,可以使得配置標準化、格式統一化
(2)當配置信息發生變動時,修改實時生效,無需要重新重啟服務器,就能夠自動感知相應的變化,并將新的變化統一發送到相應程序上,快速響應變化。比方說某個功能只是針對某個地區用戶,還有某個功能只在大促的時段開放,使用配置中心后只需要相關人員在配置中心動態去調整參數,就基本上可以實時或準實時去調整相關對應的業務。
(3)通過審計功能還可以追溯問題
二、Nacos配置中心的使用:
????????微服務中配置中心的主流解決方案主要有三種:Nacos、Apollo、Config+Bus,不過這篇文章我們主要介紹 Nacos 作為配置中心的用法,對其他兩種方式感興趣的讀者請自行上網查閱
1、Springboot 整合 Nacos 配置中心:
(1)首先我們聲明項目的版本信息:
<properties><spring-boot.version>2.3.2.RELEASE</spring-boot.version><spring-cloud.version>Hoxton.SR9</spring-cloud.version><spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version> </properties><!-- 只聲明依賴,不引入依賴 --> <dependencyManagement><dependencies><!-- 聲明springBoot版本 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- 聲明springCloud版本 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- 聲明 springCloud Alibaba 版本 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies> </dependencyManagement>(2)添加 nacos 配置中心的 maven 依賴:
<!-- SpringCloud Ailibaba Nacos Config --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>(3)在 application.properties 文件中添加 nacos 配置中心相關配置:
spring.profiles.active=dev spring.application.name=cloud-producer-server server.port=8080# nacos 配置中心地址 spring.cloud.nacos.config.server-addr=localhost:8848 # 配置文件的類型 spring.cloud.nacos.config.file-extension=yaml(4)在 nacos 控制臺新建一個 DataID 為 cloud-producer-server-dev.yaml 的配置集:
為什么 DataID 的命名為 cloud-producer-server-dev.yaml 會在下文介紹
?(5)編寫測試類:
//配置發布之后,動態刷新配置 @RefreshScope @RestController @RequestMapping("provider") public class ProviderController {// 使用原生注解@Value()導入配置@Value("${user.id}")private String id;@Value("${user.name}")private String name;@Value("${user.age}")private String age;@GetMapping("getNacosConfig")public String providerTest(){return "我是provider,已成功獲取nacos配置中心的數據:(id:" + id + ",name:" + name + ",age:" + age +")";} }(6)啟動服務驗證:
????????啟動項目,訪問 http://localhost:8080/provider/getNacosConfig 接口,可以看到 nacos 配置中心的配置信息已經生效并被成功獲取到了
(7)驗證動態刷新配置:
????????配置的動態刷新是配置中心最核心的功能之一,假設我現在需要修改 user.name 的值,那么我直接改變 Nacos 中的配置會生效嗎?我們試下直接將 Nacos 中的配置修改成 “zhangsan”,如下圖:
?此時不重啟項目并重新訪問該接口,結果如下:
????????我們發現配置已經動態刷新了,這是為什么呢?其實是由于我們在類上添加了 @RefreshScope 注解而產生的效果。
//配置發布之后,動態刷新配置 @RefreshScope @RestController @RequestMapping("provider") public class ProviderController2、Nacos 的核心概念:
2.1、Data ID:
(1)Data ID 的命名格式:
????????前面我們演示了在 nacos 控制臺新建一個 DataID 為 cloud-producer-server-dev.yaml 的數據集,那么這個 Data ID 是什么呢?Data ID 是配置集的唯一標識,一個應用可以包含多個配置集,每個配置集都需要被一個有意義的名稱標識。那么 Data ID 怎么取值呢?格式通俗一點就是 “前綴-環境-擴展名”,如下所示:
${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
① prefix:前綴,默認是 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix 來配置。
# 若不指定,默認采用應用名的方案 spring.application.name=cloud-producer-server# 手動指定配置的dataID前綴標識 # spring.cloud.nacos.config.prefix=cloud-producer-server-config② active:配置運行環境,即為當前環境對應的 profile。
注意:當 spring.profiles.active 為空時,對應的連接符 ”-“ 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
# dev表示開發環境 spring.profiles.active=dev③ file-exetension:配置文件的類型,默認是 properties,也可以通過配置項 spring.cloud.nacos.config.file-extension 來配置,目前支持的類型有 TEXT、JSON、XML、YAML、HTML、Properties
# 指定配置文件類型為yaml文件 spring.cloud.nacos.config.file-extension=yaml④ 最終配置:
????????經過前面三個步驟,我們最終在nacos配置中心的控制臺新增配置文件就是:cloud-producer-server.yaml
2.2、環境隔離-命名空間Namespace:
????????Nacos 引入命名空間 Namespace 的概念來進行多環境配置和服務的管理及隔離。例如,你可能存在本地開發環境dev、測試環境test、生產環境prod 三個不同的環境,那么可以創建三個不同的 Namespace 區分不同的環境。創建方式如下:
?創建完成后,就可以在Nacos 控制臺的配置列表上面看到不同的命名空間了,如下圖:
????????成功創建新命名空間后,就可以在 springboot 的配置文件配置命名空間的 id 切換到對應的命名空間,并獲取對應空間下的配置文件,但在沒有指定命名空間配置的情況下,默認的配置都是在 public 空間中,指定命名空間的方式如下:
# 對應創建的命名空間的ID,此處對應的是dev命名空間 cloud.nacos.config.namespace=483bb765-a42d-4112-90bc-50b8dff768b32.3、業務隔離-Group分組:
????????Group 也可以實現環境隔離的功能,但 Group 設計的目的主要是做同一個環境中的不同服務分組,把不同的微服務的配置文件劃分到同一個分組里面去,Nacos 如果不指定 Group,則默認的分組是 DEFAULT_GROUP。
????????如果沒有 Group,試想一下這個場景:有兩個微服務,一個是訂單系統,一個是用戶系統,但是他們有著相同的配置,比如 datasource-url,那么如何區分呢?這時候 Group 就派上用場了。上述場景中訂單系統、用戶系統可以單獨分為一個組,比如 ORDER_GROUP、USER_GROUP,當然這是比較細粒度的分組,根據企業的業務也可以多個微服務分為一組。
????????接下來我們演示一下創建配置集時以及集成時如何指定分組,還是前面的例子,新建配置集是在如下位置指定Group分組:
?接下來在 application.properties 文件分組:
spring.cloud.nacos.config.namespace=483bb765-a42d-4112-90bc-50b8dff768b33、小結:
Nacos 實現配置管理和動態配置刷新很簡單,總結如下步驟:
- ① 添加對應 spring-cloud-starter-alibaba-nacos-config 依賴
- ② 使用原生注解 @Value() 導入配置
- ③ 使用原生注解 @RefreshScope 刷新配置
- ④ 根據自己業務場景做好多環境配置隔離(Namespace)、不同業務配置隔離(Group)
4、共享配置:
????????當我們微服務的數量越來越多,勢必會有相同的配置,這時我們可以將相同的配置抽取出來作為項目中共有的配置,比如集群中的數據源信息、日志的配置信息,nacos 也是支持這種一個配置中心多個配置集這種寫法的。
(1)我們在nacos中新建兩個 Data ID 分別是 db.yaml 和 log.yaml 的文件。
(2)在配置文件中分別加入部分配置內容
(3)在 Springboot 項目中添加如下的 nacos 配置:
spring:cloud:nacos:config:extension-configs[0]:data-id: db.yaml# 默認為DEFAULT_GROUPgroup: DEFAULT_GROUP# 是否動態刷新,默認為falserefresh: trueextension-configs[1]:data-id: log.yamlgroup: DEFAULT_GROUPrefresh: true為了更加清晰的在多個應用間配置共享的 Data Id,官方推薦使用 shared-configs,配置如下:
spring:cloud:nacos:config:shared-configs[0]:data-id: db.yaml# 默認為DEFAULT_GROUPgroup: DEFAULT_GROUP # 是否動態刷新,默認為falserefresh: true shared-configs[1]:data-id: log.yamlgroup: DEFAULT_GROUPrefresh: true(4)思考:在這2個文件中出現相同配置,nacos如何選取?
????????當多個 Data Id 同時出現相同的配置時,它的優先級關系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,優先級越高。
注意:spring.cloud.nacos.config.extension-configs[n].data-id 的值必須帶文件擴展名,文件擴展名既可支持 properties,又可以支持 yaml/yml。此時 spring.cloud.nacos.config.file-extension 的配置對自定義擴展配置的 Data Id 文件擴展名沒有影響。
(5)不同方式配置加載優先級:
????????Nacos 配置中心目前提供以下三種配置能力從 Nacos 拉取相關的配置,當三種方式共同使用時,他們的一個優先級關系是:A < B < C:
- A:通過 spring.cloud.nacos.config.shared-configs[n].data-id 支持多個共享 Data Id 的配置
- B:通過 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多個擴展 Data Id 的配置
- C:通過內部相關規則(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自動生成相關的 Data Id 配置
參考文章:
SpringBoot2.X整合Nacos做配置中心
五十五張圖告訴你微服務的靈魂擺渡者Nacos究竟有多強?
總結
以上是生活随笔為你收集整理的Nacos配置中心用法详细介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringCloud LoadBala
- 下一篇: SpringCloud OpenFeig