Nacos 提供用於存儲配置和其餘元數據的 key/value 存儲,爲分佈式系統中的外部化配置提供服務器端和客戶端支持。使用 Spring Cloud Alibaba Nacos Config,您能夠在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。java
首先咱們來看一下,微服務架構下關於配置文件的一些問題:git
基於上面這些問題,咱們就須要引入配置中心來解決。github
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <!--Spring cloud Hoxton.SR3--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR3</version> <type>pom</type> <scope>import</scope> </dependency> <!--Spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.1.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> </dependencies>
配置文件加載的優先級(由高到低)spring
bootstrap.properties ->bootstrap.yml -> application.properties -> application.ymlbootstrap
server: port: 9002 spring: profiles: active: dev application: name: nacos-config-server cloud: nacos: config: server-addr: 127.0.0.1:8848 # 配置中心 file-extension: yaml # 這裏指定的文件格式須要和nacos上新建的配置文件後綴相同,不然讀不到
@SpringBootApplication public class NacosConfigServerApplication { public static void main(String[] args) { SpringApplication.run(NacosConfigServerApplication.class, args); } @RestController class TestController { @Value("${config.info}") private String config; @GetMapping("/test") public String hello() { return config; } } }
咱們經過@Value註解能夠獲取到配置中心的值。服務器
在TestController上加個@RefreshScope註解,而後咱們去nacos客戶端手動修改config.info的信息,而後從新調用這個/test接口,會發現響應的是修改後的內容。架構
用於進行租戶粒度的配置隔離。不一樣的命名空間下,能夠存在相同的 Group 或 Data ID 的配置。Namespace 的經常使用場景之一是不一樣環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。app
在沒有明確指定命名空間配置的狀況下, 默認使用的是 Nacos 上 Public 這個namespae。分佈式
首先咱們在nacos客戶端新建一個命名空間,spring-boot
而後咱們在配置文件中新增下面這個屬性,具體的值填寫咱們新增命名空間的ID,這樣啓動config服務後,就會自動去這個命名空間下尋找對應的配置文件了。
spring: cloud: nacos: config: namespace:
最開始的時候咱們也說過微服務項目會有多個環境,咱們如何實現和管理這些環境呢?
咱們能夠在配置文件中指定spring.profiles.active = **,而後在nocas客戶端新建對應的${spring.cloud.nacos.config.prefix}-
${spring.profiles.active}.
${spring.cloud.nacos.config.file-extension}配置來區分不一樣的環境。
咱們能夠爲不一樣的環境新建不一樣的分組,而後的配置文件中指定spring.cloud.nacos.config.group=組名,這樣也能夠實現不一樣環境的區分。
這種方式是官方建議的方式,在nacos客戶端中新建不一樣的分組,而後再配置文件中指定namespace就能夠區分不一樣的環境了。
大多數時候咱們可能更加傾向於將不一樣的配置分開寫到不一樣的配置文件中,好比我想把文件類和日誌類的配置拆分開寫到兩個配置中,nacos也是支持這種寫法的。
咱們在配置文件中分別加入如下內容:log:level: 2,file:url: "http://123.com"。
spring: cloud: nacos: config: extension-configs[0]: data-id: log.yaml group: DEFAULT_GROUP # 默認爲DEFAULT_GROUP refresh: true # 是否動態刷新,默認爲false extension-configs[1]: data-id: file.yaml group: DEFAULT_GROUP refresh: true
爲了更加清晰的在多個應用間配置共享的 Data Id,官方推薦使用以下配置:
spring: cloud: nacos: config: shared-configs[0]: data-id: log.yaml group: DEFAULT_GROUP # 默認爲DEFAULT_GROUP refresh: true # 是否動態刷新,默認爲false shared-configs[1]: data-id: file.yaml group: DEFAULT_GROUP refresh: true
咱們將file.yaml中的配置改爲log:level: 22。這時候咱們加載寫個接口取一下配置。看看它取到的是哪一個文件的內容。
RestController @RefreshScope class TestController { @Value("${log.level}") private String log; @GetMapping("/test") public String hello() { return "log.lelve="+log; } }
結果取到的是file.yaml中的配置,這是由於多個 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 文件擴展名沒有影響。
Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置。
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.file-extension、
spring.cloud.nacos.config.group)自動生成相關的 Data Id 配置當三種方式共同使用時,他們的一個優先級關係是:A < B < C