官方文档地址:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
新建一个nacos-config的spring cloud项目中添加spring-cloud-starter-alibaba-nacos-config依赖
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
启动nacos服务,登录并打开配置管理的配置列表,新建配置。
Nacos 在 Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为 spring.application.name
的值,也可以通过配置项 spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile。 注意:当 spring.profiles.active
为空时,对应的连接符 -
也将不存在,dataId
的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。注意dataId
是以 properties
(默认的文件扩展名方式)为扩展名dataId
为${prefix}
的配置,即dataId
为服务名的配置。当${prefix}
与${prefix}-${spring.profiles.active}.${file-extension}
这两种配置文件都存在且其中有相同的配置属性时,后者的优先级更高,会覆盖前者中相同属性的值。新建两个配置,DataId分别为nacos-service-dev.yaml和nacos-service-pro.yaml,并在其配置内容中分别添加以下内容:
#nacos-service-dev.yaml
user:
name: 张三
current:
env: dev
#nacos-service-pro.yaml
user:
name: 李四
current:
env: pro
必须使用 bootstrap.properties或bootstrap.yml 配置文件来配置nacos的相关内容。
spring:
profiles:
active: dev
application:
name: nacos-service
cloud:
nacos:
# 当nacos客户端的配置中nacos.core.auth.enabled=true时,username、password不能省略
username: nacos
password: nacos
config:
server-addr: 127.0.0.1:8848
# 声明dataid的扩展名,默认为properties
file-extension: yaml
#配置动态感知 默认为true
refresh-enabled: true
namespace: public
要注意的是: 这里依赖引入的是nacos-config,而不是nacos-discovery,配置方式还是有所差异的,所以直接nacos.username而不是nacos.discovery.username;还有一点当nacos开启权限认证时,也就是将nacos客户端的conf/application.properties文件中nacos.core.auth.enabled属性值改为了true,这时项目配置中的username和password是不能省略的。
其中通过spring.cloud.nacos.config.file-extension
指定dataid
的文件扩展名。
spring-cloud-starter-alibaba-nacos-config 支持配置的动态更新,当配置变更时,应用程序中能够获取到最新的值。也可以通过配置 spring.cloud.nacos.config.refresh-enabled=false
来关闭动态刷新。
通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新。
package com.xc.nacos.controller;
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;
/**
* @author wyp
*/
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${user.name}")
private String name;
@RequestMapping("/getName")
public String getName() {
System.out.println("name = " + name);
return name;
}
}
当使用@Value获取属性不存在时,项目启动报错。
先在启动类中获取ConfigurableApplicationContext对象
package com.xc.nacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @author wyp
*/
@SpringBootApplication
public class NacosApplication {
private static ConfigurableApplicationContext applicationContext;
public static void main(String[] args) {
NacosApplication.applicationContext = SpringApplication.run(NacosApplication.class, args);
}
public static ConfigurableApplicationContext getApplicationContext() {
return applicationContext;
}
}
之后便可以通过ConfigurableApplicationContext对象.getEnvironment().getProperty(键)
获取,如下:
String username = NacosApplication.getApplicationContext().getEnvironment().getProperty("user.name");
命名空间用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在项目中没有明确指定 spring.cloud.nacos.config.namespace
配置的情况下, 默认使用的是 Nacos 上 public 这个namespae。此外 spring.cloud.nacos.config.namespace
的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=18b83298-12e2-4186-94b0-dff6cee3a8c9
在项目中没有明确指定 spring.cloud.nacos.config.group
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=CUSTOM_GROUP
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
spring.cloud.nacos.config.extension-configs中extension-configs是一个Config类集合。Config类中有三个属性,dataId、group(默认为"DEFAULT_GROUP")、refresh(默认为false)。
spring:
cloud:
nacos:
config:
extension-configs:
# [0]
- data-id: nacos-service.common.e1.properties
refresh: true
group: DEFAULT_GROUP
# [1]
- data-id: nacos-service.common.e2.properties
refresh: true
group: DEFAULT_GROUP
上面配置添加了在默认的组 DEFAULT_GROUP且支持配置的动态刷新的两个配置,extension-configs中的配置项优先级靠索引值大小,索引值越大的优先级越大。
spring.cloud.nacos.config.shared-configs中shared-configs是一个Config类集合。用法和extension-configs一样。
spring:
cloud:
nacos:
config:
shared-configs[0]:
data-id: nacos-service.common.s1.properties
refresh: true
group: DEFAULT_GROUP
shared-configs[1]:
data-id: nacos-service.common.s2.properties
refresh: true
group: DEFAULT_GROUP
上面配置添加了在默认的组 DEFAULT_GROUP且支持配置的动态刷新的两个配置,shared-configs中的配置项优先级靠索引值大小,索引值越大的优先级越大。
两者的data-id
属性值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension
的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
extension-configs的优先级大于shared-configs,所以shared-configs更加清晰的在多个应用间配置共享的 Data Id。
上面一共提到了四种配置:
${prefix}-${spring.profiles.active}.${file-extension}
${prefix}
extension-configs
shared-configs
优先级从大到小为①②③④。