Nacos Config 使用
简介
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-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
不同项目之间配置独立不共享
多个项目之间共享部分配置,比如注册中心地址等
单个项目多个配置文件
同一部署环境中不同情况配置
灰度发布