使用 Spring Cloud Config 我们可以实现配置的集中化管理,但 Spring Cloud Config 如果要实现配置的动态更新, 则需要借助 Spring Cloud Bus(参考 Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新)。 Nacos 不仅可作为服务注册中心,同时还可以作为配置的集中化管理中心,且其自身默认就支持动态更新,集成非常方便。

Nacos 配置管理集成

  1. pom.xml 中添加依赖
1
2
3
4
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. bootstrap.yaml 中添加配置:
1
2
3
4
5
6
7
8
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 端口也不能省略。

  1. 访问配置

在程序中可通过 @Value 注解或 @ConfigurationProperties 修饰的类来访问配置信息

1
2
3
4
5
6
7
8
9
10
11
12
@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 注解

  1. 控制台添加配置

在 Nacos 控制台“配置管理”中,可以针对项目添加配置,如图

nacos配置管理

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

nacos添加配置

配置格式需要与前面配置的 spring.cloud.nacos.config.file-extension 一致,默认是 properties 格式。

配置支持 profile,spring.profiles.active 必须配置在 bootstrap.properties(yaml) 文件中。

启动项目时, 启动日志中能看到如下信息

1
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 控制台,我们可以根据需要添加命名空间,如图

Nacos命名空间

然后在 bootstrap.yaml 中,针对不同的 profile, 指定不同的 namespace ID, 如下 dev 环境指定 namespace 名称为 dev 的 ID。

1
2
3
4
5
6
7
8
9
---
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 名称默认情况下从如下三个配置获取,

  1. spring.cloud.nacos.config.prefix
  2. spring.cloud.nacos.config.name
  3. spring.application.name

首先取 prefix,如果没有则取 name, 最后才取 spring.application.name

我们可以通过 extension-configs 来自定义 DataId, 示例如下

1
2
3
4
5
6
7
8
9
10
11
# 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 的优先级要低。

我们将配置调整如下,

1
2
3
4
5
6
7
8
9
10
11
12
13
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

重启服务,从启动日志中我们也可以看到配置的优先级顺序。

1
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'}]
  1. robot-dev.yaml
  2. robot.yaml
  3. robot
  4. ext-config-2.properties
  5. ext-config-1.properties

从上到下优先级依次降低。

共享配置

自定义的 data id 可以在多个应用之间共享配置,或一个应用使用多个配置,共享配置与自定义配置类似,只需将 extension-configs 改为 shared-configs,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
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 类,支持三个属性:

  1. dataId:DataId 名称
  2. group: DataId 所在的 Group,默认为 DEFAULT_GROUP
  3. 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 可查看。

总结

  1. Nacos 配置以 namespace, group, dataId 的组织形式进行管理,可通过 namespace 来隔离不同环境或不同租户。
  2. 配置支持 profile,spring.profiles.active 必须配置在 bootstrap.properties(yaml) 文件中。
  3. Nacos 默认支持动态更新配置,需要程序不重启实现配置的动态更新,还需在相应类上添加 @RefreshScope 注解。
  4. Nacos 配置包括默认 DataId(按 prefix, name, spring.application.name 顺序获取),自定义 DataId(extensionConfigs), 共享 DataId(sharedConfigs),其优先级按默认-自定义-共享依次降低。

评论