Nacos 提供用於存儲配置和其他元數據的 key/value 存儲,為分布式系統中的外部化配置提供服務器端和客戶端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 應用的外部屬性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客戶端和服務器上的概念與 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 階段,配置被加載到 Spring 環境中。當應用程序通過部署管道從開發到測試再到生產時,您可以管理這些環境之間的配置,並確保應用程序具有遷移時需要運行的所有內容。
實站驗證:
啟動好Nacos之后,在Nacos添加如下的配置:
Data ID: springboot2-nacos-discovery.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置內容:
user.name=nacos-config-properties
user.age=90
useLocalCache=false
Note
|
注意dataid是以 properties(默認的文件擴展名方式)為擴展名。 |
點擊發布。
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}
prefix
默認為spring.application.name
的值,也可以通過配置項spring.cloud.nacos.config.prefix
來配置。spring.profile.active
即為當前環境對應的 profile,詳情可以參考 Spring Boot文檔。 注意:當spring.profile.active
為空時,對應的連接符-
也將不存在,dataId 的拼接格式變成${prefix}.${file-extension}
file-exetension
為配置內容的數據格式,可以通過配置項spring.cloud.nacos.config.file-extension
來配置。目前只支持properties
和yaml
類型。
添加依賴:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${latest.version}</version> </dependency>
使用配置,在 bootstrap.properties
中配置
spring.application.name=springboot2-nacos-discovery
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
通過ConfigurableApplicationContext 來調用配置在nacos的配置項
public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosApplication.class, args); String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.err.println("user name :"+userName+"; age: "+userAge); }
控制器中也可以直接使用
package com.xin.cloud.nacos; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${useLocalCache:false}") private boolean useLocalCache; @RequestMapping("/get") public boolean get() { return useLocalCache; } }
驗證
http://localhost:8080/config/get
支持自定義擴展的 Data Id 配置
Spring Cloud Alibaba Nacos Config 從 0.2.1 版本后,可支持自定義 Data Id 的配置。關於這部分詳細的設計可參考 這里。 一個完整的配置案例如下所示:
spring.application.name=opensource-service-provider spring.cloud.nacos.config.server-addr=127.0.0.1:8848 # config external configuration # 1、Data Id 在默認的組 DEFAULT_GROUP,不支持配置的動態刷新 spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties # 2、Data Id 不在默認的組,不支持動態刷新 spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP # 3、Data Id 既不在默認的組,也支持動態刷新 spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP spring.cloud.nacos.config.extension-configs[2].refresh=true
可以看到:
-
通過
spring.cloud.nacos.config.extension-configs[n].data-id
的配置方式來支持多個 Data Id 的配置。 -
通過
spring.cloud.nacos.config.extension-configs[n].group
的配置方式自定義 Data Id 所在的組,不明確配置的話,默認是 DEFAULT_GROUP。 -
通過
spring.cloud.nacos.config.extension-configs[n].refresh
的配置方式來控制該 Data Id 在配置變更時,是否支持應用中可動態刷新, 感知到最新的配置值。默認是不支持的。
Note
|
多個 Data Id 同時配置時,他的優先級關系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,優先級越高。 |
Note
|
spring.cloud.nacos.config.extension-configs[n].data-id 的值必須帶文件擴展名,文件擴展名既可支持 properties,又可以支持 yaml/yml。 此時 spring.cloud.nacos.config.file-extension 的配置對自定義擴展配置的 Data Id 文件擴展名沒有影響。 |
通過自定義擴展的 Data Id 配置,既可以解決多個應用間配置共享的問題,又可以支持一個應用有多個配置文件。
為了更加清晰的在多個應用間配置共享的 Data Id ,你可以通過以下的方式來配置:
# 配置支持共享的 Data Id spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml # 配置 Data Id 所在分組,缺省默認 DEFAULT_GROUP spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1 # 配置Data Id 在配置變更時,是否動態刷新,缺省默認 false spring.cloud.nacos.config.shared-configs[0].refresh=true
可以看到:
-
通過
spring.cloud.nacos.config.shared-configs[n].data-id
來支持多個共享 Data Id 的配置。 -
通過
spring.cloud.nacos.config.shared-configs[n].group
來配置自定義 Data Id 所在的組,不明確配置的話,默認是 DEFAULT_GROUP。 -
通過
spring.cloud.nacos.config.shared-configs[n].refresh
來控制該Data Id在配置變更時,是否支持應用中動態刷新,默認false。
配置的優先級
Spring Cloud Alibaba Nacos Config 目前提供了三種配置能力從 Nacos 拉取相關的配置。
-
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: 通過內部相關規則(應用名、應用名+ Profile )自動生成相關的 Data Id 配置
當三種方式共同使用時,他們的一個優先級關系是:A < B < C