使用 Spring Cloud Config 我们可以实现配置的集中化管理,但 Spring Cloud Config 如果要实现配置的动态更新, 则需要借助 Spring Cloud Bus(参考 Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新)。Nacos 不仅可作为服务注册中心,同时还可以作为配置的集中化管理中心,且其自身默认就支持动态更新,集成非常方便。
Nacos 配置管理集成
pom.xml 中添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>复制
bootstrap.yaml 中添加配置:
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.40.201:8848
config:
server-addr: 192.168.40.201:8848
file-extension: yaml # 默认是properties格式复制
spring.cloud.nacos.config.server-addr
如果配置的是域名, 则端口不能省略, 即便是 80 端口也不能省略。
访问配置
在程序中可通过 @Value 注解或 @ConfigurationProperties 修饰的类来访问配置信息
@RestController
@RefreshScope
public class TestController {
@Value("${test.hello}")
private String hello;
@GetMapping("test")
public String test(@RequestParam("name")String name) {
return hello + name;
}
}复制
Nacos 默认是支持动态更新配置的,当你在控制台修改后,本地立即可获取到更新的配置,但如果需要程序动态更新,则仍需要在相应类上添加 @RefreshScope 注解
控制台添加配置
在 Nacos 控制台“配置管理”中,可以针对项目添加配置,如图

每一个配置通过 Group 与 DataId 来确定,Group 默认为 DEFAULT_GROUP(可通过 spring.cloud.nacos.config.group
指定), 如图

配置格式需要与前面配置的 spring.cloud.nacos.config.file-extension
一致,默认是 properties 格式。
配置支持 profile,spring.profiles.active
必须配置在 bootstrap.properties(yaml) 文件中。
启动项目时, 启动日志中能看到如下信息
Located property source: [BootstrapPropertySource {name='bootstrapProperties-robot-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-robot.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-robot,DEFAULT_GROUP'}]
复制
Nacos 默认会加载 DataId 为 {spring.application.name}-{spring.profiles.active}.yaml,{spring.application.name}.yaml,{spring.application.name} 的配置源,其中文件扩展名 yaml 与你配置有关,默认为 properties。配置优先级顺序为从前往后依次降低。
动态更新
Nacos 默认是支持动态更新配置,如果要禁用,可配置 spring.cloud.nacos.config.refresh-enabled=false
。如果需要程序不重启实现配置的动态更新,还需在相应类上添加 @RefreshScope 注解
命名空间
Nacos 支持自定义 namespace, 在多租户环境中,或同一租户的不同环境中(如,开发环境、测试环境、生产环境)可以使用不同的 namespace 来进行配置隔离。
在 Nacos 控制台,我们可以根据需要添加命名空间,如图

然后在 bootstrap.yaml 中,针对不同的 profile, 指定不同的 namespace ID, 如下 dev 环境指定 namespace 名称为 dev 的 ID。
---
spring:
profiles: dev
cloud:
nacos:
discovery:
namespace: 1a743385-86e7-4405-b73f-0108df042710
config:
namespace: 1a743385-86e7-4405-b73f-0108df042710复制
上述配置在服务以 spring.profiles.active=dev
启动后,将注册到 dev namespace 中,并从 dev namespace 中获取配置。
如果
spring.cloud.nacos.config.namespace
未指定,则默认使用 Public
自定义 DataId
DataId 名称默认情况下从如下三个配置获取,
spring.cloud.nacos.config.prefix spring.cloud.nacos.config.name spring.application.name
首先取 prefix,如果没有则取 name, 最后才取 spring.application.name
。
我们可以通过 extension-configs 来自定义 DataId, 示例如下
# 1. 默认使用 DEFAULT_GROUP,不支持配置的动态更新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-1.properties # 可以配置多个data id,逗号隔开
# 2. 指定 Group,不支持配置的动态更新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-2.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP # 可以配置多个group
# 3. 指定 Group,支持配置的动态更新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-3.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true复制
自定义 DataId 必须有文件扩展名(properties 或 yaml/yml),这与 spring.cloud.nacos.config.file-extension
配置的扩展名没什么干系。自定义 DataId 默认不支持动态更新,需显示配置。自定义 DataId 配置的优先级与 extension-configs[n] 中的 n 有关,n 越大, 优先级越高。
extension-configs 的 DataId 配置优先级与默认 DataId 的优先级要低。
我们将配置调整如下,
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.40.201:8848
config:
server-addr: 192.168.40.201:8848
file-extension: yaml
extension-configs:
- data-id: ext-config-1.properties
refresh: true
- data-id: ext-config-2.properties
refresh: true复制
重启服务,从启动日志中我们也可以看到配置的优先级顺序。
Located property source: [BootstrapPropertySource {name='bootstrapProperties-robot-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-robot.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-robot,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ext-config-2.properties,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-ext-config-1.properties,DEFAULT_GROUP'}]
复制
robot-dev.yaml robot.yaml robot ext-config-2.properties ext-config-1.properties
从上到下优先级依次降低。
共享配置
自定义的 data id 可以在多个应用之间共享配置,或一个应用使用多个配置,共享配置与自定义配置类似,只需将 extension-configs 改为 shared-configs,如下
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.40.201:8848
config:
server-addr: 192.168.40.201:8848
file-extension: yaml
extension-configs:
- data-id: ext-config-1.properties
refresh: true
shared-configs:
- data-id: commom.properties复制
shared-configs 配置中, 后面的优于前面的;shared-configs 的 data id 也必须有扩展名,spring.cloud.nacos.config.file-extension
定义的扩展名对它没什么影响。
从启动日志中我们也可以看到共享 DataId 配置(shared-configs)的优先级低于自定义 DataId 配置(extension-configs)。
extension-configs 与 shared-configs 配置对应 com.alibaba.cloud.nacos.NacosConfigProperties.Config
类,支持三个属性:
dataId:DataId 名称 group:DataId 所在的 Group,默认为 DEFAULT_GROUP refresh:是否支持动态更新,默认为 false
Nacos Config 配置属性
Nacos 配置管理的属性汇总(属性前缀均为 spring.cloud.nacos.config
)
属性 | 默认值 | 描述 |
---|---|---|
server-addr | nacos 服务的 IP:端口 | |
prefix | DataId 名称首先从 prefix 获取,如果为空则从 name 获取,最后从 spring.application.name 获取 | |
name | 同上 | |
encode | 配置内容的编码字符集 | |
namespace | public | 命名空间,用于隔离管理 |
group | DEFAULT_GROUP | DataId 所在 group |
fileExtension | properties | DataId 的后缀或扩展名,支持properties 或 yaml(yml) |
timeout | 3000 | 从 nacos 获取配置的超时时间,单位毫秒 |
endpoint | nacos 服务名称,服务器地址可通过它动态获取 | |
accessKey | 阿里云账号的 accesskey | |
secretKey | 阿里云账号的 secretkey | |
contextPath | nacos 服务上下文路径 | |
clusterName | Nacos 服务集群名称 | |
extensionConfigs | 自定义 DataId, 一个列表,以Config 类构建,支持三个属性:dataId, group 与 refresh | |
sharedConfigs | 共享配置列表,与 extensionConfigs 类似 |
actuator 接口
nacos config 提供了一个 actuator endpoint (nacos-config)来暴露三个属性:
Sources:当前应用配置的数据信息,包括 dataId 与 上一次同步时间 RefreshHistory:配置刷新历史 NacosConfigProperties:当前服务的基本 Nacos 配置及包含的 sharedConfigs, extensionConfigs, configServiceProperties,以及向后兼容的 extConfig, sharedDataids 等
通过访问:http://localhost:8080/actuator/nacos-config 可查看。
总结
Nacos 配置以 namespace, group, dataId 的组织形式进行管理,可通过 namespace 来隔离不同环境或不同租户。 配置支持 profile, spring.profiles.active
必须配置在 bootstrap.properties(yaml) 文件中。Nacos 默认支持动态更新配置,需要程序不重启实现配置的动态更新,还需在相应类上添加 @RefreshScope 注解。 Nacos 配置包括默认 DataId(按 prefix, name, spring.application.name 顺序获取),自定义 DataId(extensionConfigs), 共享 DataId(sharedConfigs),其优先级按默认-自定义-共享依次降低。
推荐阅读:
1. Spring Cloud(五):服务配置管理中心
2. Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新
3. Spring Cloud(九):服务发现,除了Eureka,还有Nacos
作者:雨歌
微信扫描二维码,关注公众号及时获取最新分享
点个在看,支持作者