簡介
nacos主要提供了以下幾個功能:
1、配置中心
2、服務發現和服務健康監測
3、動態DNS
4、服務及其元數據管理
常用的功能是配置中心、服務發現
本文主要是對Nacos Config 官方文檔的補充,官方文檔地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
本文樣例代碼:
部署:
https://nacos.io/zh-cn/docs/deployment.html
配置中心:
跟spring cloud config 類似,但是更易用,輕量,運維成本也更低
與apollo相比配置中心的功能更少一點,但是夠用了。部署方面apollo最少需要部署5台,而nacos只需要3台
配置中心使用
nacos控制台添加配置
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置內容: user.name=nacos-config-properties
user.age=90
注意dataid是以 properties(默認的文件擴展名方式)為擴展名。dataid必須要帶擴展名不然獲取不到對應配置
在 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 類型。
client端:
添加依賴:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--需要引入該jar才能使bootstrap配置文件生效-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
添加配置文件:
本文所有配置文件都是配置到bootstrap.properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
配置全局開關 默認true開啟
spring.cloud.nacos.config.enabled = true
配置文件擴展
spring.cloud.nacos.config.file-extension=yaml
dataid必須要帶擴展名,且和file-extension配置相同,原因上面已講述
client端-獲取配置
獲取配置方式1:通過Environment對象
在項目的任何地方獲取Environment對象都可以拉取nacos配置
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}
注意當你使用域名的方式來訪問 Nacos 時,spring.cloud.nacos.config.server-addr 配置的方式為 域名:port。 例如 Nacos 的域名為abc.com.nacos,監聽的端口為 80,則 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。
配置是否自動刷新,默認true
spring.cloud.nacos.config.refresh-enabled
獲取配置方式2(項目中一般使用方式):
通過注解獲取
@Configuration
@ConfigurationProperties
@Value
@Configuration;@ConfigurationProperties需要結合@RefreshScope注解來動態刷新配置
所以在項目中建議使用@Value來拉取配置
@Value("${user.name}")
private String userName
單機部署時有時會遇到拉取不到配置的坑,這時重啟nacos即可。
可以使用Open-API 拼接url直接訪問配置檢查是否有問題
http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=xxxx.yaml&group=DEFAULT_GROUP
若配置正確卻讀取不到配置,重啟即可
profile粒度的配置
通過spring的配置參數來指定profile:
spring.profiles.active
nacos會先加載\({spring.application.name}.\){file-extension:properties} 為前綴的基礎配置,
然后再加載dataid為 \({spring.application.name}-\){profile}.${file-extension:properties} 的基礎配置,且若配置名稱相同后者會覆蓋前者
此案例中我們通過 spring.profiles.active=
自定義namespace
spring.cloud.nacos.config.namespace=[命名空間id]
默認為public這個保留空間
自定義group
spring.cloud.nacos.config.group=[group名稱]
默認DEFAULT_GROUP
所以項目默認是讀取namespace為public中的DEFAULT_GROUP組下的\({spring.application.name}.\){file-extension:properties}配置文件,且都會拉取一遍這個配置,相當於默認兜底配置
自定義擴展的DataId配置
配置文件
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 既不在默認的組,也支持動態刷新
# 配置data-id名稱 必須帶擴展名稱
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
# group值
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
# 是否動態刷新 默認不支持
spring.cloud.nacos.config.extension-configs[2].refresh=true
- 多個 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 文件擴展名沒有影響。
通過自定義擴展的 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
三種方式的加載源碼在NacosPropertySourceLocator 類locate方法
this.loadSharedConfiguration(composite);
this.loadExtConfiguration(composite);
this.loadApplicationConfiguration(composite, dataIdPrefix, this.nacosConfigProperties, env);
由此也可以得出優先級關系A < B < C
無論哪種方式配置參數不同的命名空間之間的配置不會共享
實際應用 (待完善)
多環境部署,例如:DEV TEST PRO
不同項目之間配置獨立不共享
多個項目之間共享部分配置,比如注冊中心地址等
單個項目多個配置文件
同一部署環境中不同情況配置
灰度發布