阿裡巴巴開源注冊配置中心
點選免費觀看教學視訊
在前面文章中我們學習了Nacos注冊中心注冊中心傳送門,接下來我們來學習配置中心。
Nacos配置中心
配置中心知名的有
Apllo
,
Spring Cloud Config
。
application.yml
裡邊配置的一些系統變量資料, 通常會再
Controller
裡邊用
@Value
取出使用, 但是你要是想改變他,就要重新改代碼,打包,部署,十分麻煩,我們需要讓配置檔案的值變得動起來,
Nacos
也采用了
Spring Cloud
原生注解
@RefreshScope
實作配置自動更新,
- 在需要添加配置中心的服務中添加mvn依賴
<!-- SpringCloud Ailibaba Nacos Config --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
- 修改
配置檔案,這裡我以bootstrap.yml
應用為例,新增配置中心屬性,如下:order-service
配置檔案加載的優先級(由高到低)server: port: 6010 spring: application: name: order-service cloud: nacos: discovery: #必須配置ip位址 server-addr: localhost:8848 # 将自己的服務注冊到注冊中心 register-enabled: true # 配置中心新增部分 config: server-addr: localhost:8848 file-extension: yaml profiles: active: dev # 新加屬性,作為配置測試 merber: name: 訂單服務中的配置名稱 age: 18
bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
-
類中添加OrderController
注解@RefreshScope
@RestController @RequestMapping("order") @RefreshScope //動态重新整理配置,重要 public class OrderController { //Spring正常取值 @Value("${merber.name:}") private String merberName; @Value("${merber.age:}") private Integer merberAge; @Autowired private RestTemplate restTemplate; @GetMapping("get") public String get(){ String result = restTemplate.getForObject("http://course-service/course/list", String.class); return result + ",merberName:" + merberName + ",merberAge:" + merberAge; } }
- 給配置中心預設添加一個資料集 (Data Id)
- 配置中心命名規則
-
Data Id:
在
中,資料集(Data Id) 的配置完整格式如下:Nacos Spring Cloud
,通俗一點就是${spring.cloud.nacos.config.prefix}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
字首-環境-擴充名
- prefix:預設為
的值,也可以通過配置項spring.application.name
來配置spring.cloud.nacos.config.prefix
# 手動指定 spring: cloud: nacos: config: prefix: order-service-config # 若不指定,預設采用應用名的方案 spring: application: name: order-sevice #服務名
- active:是配置開發環境的值,一個程式不可能總是在開發環境,可能需要切換到測試環境,上線環境,他們的配置檔案都是不同的,是以為了友善環境切換,我們配置不同的開發環境文檔。比如以前我們在
application.yml
中有配置dev、test、prod,其中dev就是開發環境。。
注意:當
為空時,對應的連接配接符spring.profile.active
也将不存在,dataId的拼接格式變成-
${prefix}.${file-extension}
spring: profiles: active: dev #表示開發環境
- file-extension:最後我們需要指定配置檔案類型,預設是
。我們可以自己指定檔案類型,比如配置:properties
Nacos為我們提供了:spring: cloud: nacos: config: file-extension: yaml #指定配置檔案類型為yaml檔案
幾種類型TEXT、JSON、XML、YAML、HTML、Properties
-
最終配置
指定好配置檔案類型,我們最終在配置中心新增配置檔案就是:
order-sevice-dev.yaml
- prefix:預設為
- Group
${spring.cloud.nacos.config.group} 若未配置則取Nacos預設值:DEFAULT_GROUP
-
- 啟動服務驗證 再次重新整理浏覽器請求檢視 到此配置中心接入完畢,課件代碼詳見:https://gitee.com/appdoc/it235.git,tag名:1.2.0
命名空間
Nacos
引入了命名空間(
Namespace
)的概念來進行多環境配置和服務的管理及隔離,
Namespace
也是官方推薦的多環境支援方案。
例如,你可能有
dev,test和prod
三個不同的環境,那麼使用一套 nacos 叢集可以分别建以下三個不同的
namespace
。在沒有明确指定命名空間配置的情況下, 預設新增的所有配置都在public空間,Nacos控制台對不同的
Namespace
做了Tab欄分組展示,如下圖:
隔離開發,測試,生産環境可以添加命名空間,然後在
bootstrap.yml
配置檔案添加命名空間的id即可切換到對應的命名空間,使用對應空間下的配置檔案:
cloud:
nacos:
config:
namespace: a65a17de-e8f3-4d00-8d87-91549aaa0f02 #對應建立的命名空間的UUID
也可以基于微服務來建立命名空間,用每一個微服務名來命名,達到隔離每一個微服務的目的,哪一個微服務需要配置直接去對應的微服務空間下找配置即可,使得項目更加結構化。
命名空間課件代碼詳見:https://gitee.com/appdoc/it235.git,tag名:1.3.0
Data ID
Data ID 通常用于組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱辨別。Data ID 通常采用類 Java package的命名規則保證全局唯一性。此命名規則非強制。
大多數時候我們可能更加傾向于将不同的配置分開寫到不同的配置檔案中,将一個配置檔案按功能拆分成不同的檔案,然後在程式組合加載到一起組成一個完整的配置檔案。比如我想把 DB類 和 日志類 的配置拆分開寫到兩個配置中,nacos也是支援這種一個配置中心多個配置集這種寫法的。
- 我們在nacos中建立兩個
分别是Data ID
和db.yaml
的檔案。log.yaml
- 在配置檔案中分别加入部配置設定置内容
- 更改
中的nacos配置為bootstrap.yml
為了更加清晰的在多個應用間配置共享的 Data Id,官方推薦使用spring: cloud: nacos: config: extension-configs[0]: data-id: db.yaml group: DEFAULT_GROUP # 預設為DEFAULT_GROUP refresh: true # 是否動态重新整理,預設為false extension-configs[1]: data-id: log.yaml group: DEFAULT_GROUP refresh: true
,配置如下:shared-configs
spring: cloud: nacos: config: shared-configs[0]: data-id: db.yaml group: DEFAULT_GROUP # 預設為DEFAULT_GROUP refresh: true # 是否動态重新整理,預設為false shared-configs[1]: data-id: log.yaml group: DEFAULT_GROUP refresh: true
-
思考:在這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
的配置對自定義擴充配置的 Data Id 檔案擴充名沒有影響。spring.cloud.nacos.config.file-extension
- 不同方式配置加載優先級
目前提供了三種配置能力從 Nacos 拉取相關的配置。Spring Cloud Alibaba Nacos Config
- 通過
支援多個共享 Data Id 的配置spring.cloud.nacos.config.shared-configs[n].data-id
- 通過
的方式支援多個擴充 Data Id 的配置spring.cloud.nacos.config.extension-configs[n].data-id
- 通過内部相關規則(
)自動生成相關的 Data Id 配置spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group
- 通過
-
配置集拆分實踐
以下配置集可以拆分為:db、log、mybatis 三塊
Group的使用
這是一個很靈活的配置項,并沒有固定的規定,可以用作多環境、多子產品、多版本之間區配置設定置,
namespace
因其TAB欄的設定就是用作環境隔離。
Group也能幹環境隔離這種事,但Group設計出來主要是做同一個環境中的不同服務分組,Group可以把不同的微服務劃分到同一個分組裡面去;預設所有的配置集都屬于: DEFAULT_ GROUP;
常見的分組場景(次元)
不同的應用或元件使用了相同的配置類型,比如:
- database_url 配置和 MQ_topic 配置
- 對内配置組,對外配置組
總結
- dataid:配置檔案的名字,相當于主鍵的作用;
- group: 不同的系統或微服務的配置檔案可以放在一個組裡。比如使用者系統和訂單系統的配置檔案都可以放在同個組中;
- namespace: Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等;