简介
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= 的方式写死在配置文件中,而在真正的项目实施过程中这个变量的值是需要不同环境而有不同的值。这个时候通常的做法是通过 -Dspring.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
不同项目之间配置独立不共享
多个项目之间共享部分配置,比如注册中心地址等
单个项目多个配置文件
同一部署环境中不同情况配置