官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
Nacos提供用于存储配置和其他元数据的key/value存储,为分布式系统中的外部化配置提供服务器和客户端支持。使用Spring Cloud Alibaba Nacos Config,你可以在Nacos Server集中管理你Spring Cloud 应用的外部属性配置。
springcloud config 对比:
三大优势:
准备配置,nacos server中新建nacos-config.properties
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置内容: user.name=齐菁菁
user.age=123456
注意:dataid是以properties(默认的文件扩展名方式)为扩展名
客户端使用方式
创建一个标准的SpringBoot项目,并引入依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
启动项:
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}
在运行此 Example 之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:
bootstrap.properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
启动这个 Example,可以看到如下输出结果:
user name :齐菁菁; age: 123456
spring-cloud-starter-alibaba-nacos-config 对于 yaml
格式也是完美支持的。这个时候只需要完成以下两步:
1、在应用的 bootstrap.properties
配置文件中显示的声明 dataid 文件扩展名。如下所示
spring:
cloud:
nacos:
config:
#修改默认配置文件扩展名(默认是properties)
file-extension: yaml
2、新建一个dataid为yml的配置
Data ID: nacos-config.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: user:
name: nacos-config.yaml
age: 68
这两步完成后,重启测试程序,可以看到如下输出结果。
2018-11-02 14:59:00.484 INFO 32928 --- [main]
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529 INFO 32928 --- [-127.0.0.1:8848]
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
while(true) {
//当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
如下所示,当变更user.name时,应用程序中能够获取到最新的值:
user name :齐菁菁; age: 123456
user name :齐菁菁; age: 123456
2022-06-26 20:11:16.652 WARN 10812 --- [34.254.160_8847] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [user.name]
user name :qijingjing; age: 123456
user name :qijingjing; age: 123456
user name :qijingjing; age: 123456
user name :qijingjing; age: 123456
你可以通过配置
spring.cloud.nacos.config.refresh.enabled=false
来关闭动态刷新
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 ${spring.application.name}.${file-extension:properties}
为前缀的基础配置,还加载了dataid为 ${spring.application.name}-${profile}.${file-extension:properties}
的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active}
这个配置项来配置。
spring:
profiles:
active: develop
Nacos 上新增一个dataid为:nacos-config-develop.yaml
的基础配置,如下所示:
Data ID: nacos-config-develop.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: current.env: develop-env
启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
//获取当前部署的环境
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
启动后,可见控制台的输出结果:
in develop-env enviroment; user name :nacos-config.yaml; age: 68
结论:我们的nacos-config.yaml
和nacos-config-develop.yaml
都起到了作用
知识补充:profile>默认配置文件,优先级大的会覆盖优先级小的,然后形成互补
如果需要切换环境(例如生产环境),只需要更改${spring.profiles.active}参数配置即可。同时在Nacos添加dataid为:nacos-config-product.yaml的配置即可
最佳配置:
在nacos server里面创建一个新的命名空间,例如dev
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring:
cloud:
nacos:
config:
# 默认命名空间是public,这里需要填写dev命名空间的环境值
namespace: f5fa5d97-b3df-4e3e-8aa6-6ad7bc3640bf
然后克隆几个配置文件到dev环境,启动类测试运行即可。
注意:该配置必须放在 bootstrap.yml文件中。此外 spring.cloud.nacos.config.namespace
的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置。
在没有明确指定 ${spring.cloud.nacos.config.group}
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring:
cloud:
nacos:
config:
# 组(默认是DEFAULT_GROUP)
group: STORE_GROUP
克隆配置文件到这个STORE_GROUP
组即可
注意:该配置必须放在 bootstrap.yml文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group
的配置值一致。
在之前的基础上加入新的代码:
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: com.lili.store.properties
#不指定的话默认为DEFAULT_GROUP
group: STORE_GROUP
# 自定读取刷新配置
refresh: true
extension-configs[0]:
data-id: com.lili.store1.properties
#不指定的话默认为DEFAULT_GROUP
group: STORE_GROUP
# 自定读取刷新配置
refresh: true
添加两个配置:
Data ID: com.lili.store.properties
Group : STORE_GROUP
配置格式: properties
配置内容: user.sex=男
Data ID: com.lili.store1.properties
Group : STORE_GROUP
配置格式: properties
配置内容: user.sex=女
启动测试类
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
String userSex = applicationContext.getEnvironment().getProperty("user.sex");
//获取当前部署的环境
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge + ";sex: "+ userSex);
TimeUnit.SECONDS.sleep(1);
}
}
}
结果:
in dev-namespace enviroment; user name :nacos-namespace.yaml; age: 68;sex: 女
profile > 默认配置文件 > extension-configs(下标越大优先级越大) > shard-configs(下标越大优先级越大)
@Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解即可
@RestController
@RefreshScope
public class HelloController {
@Value("${user.name}")
private String name;
@RequestMapping("/show")
public String hello(){
return this.name;
}
}