暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Cloud(十):配置管理,除了Config,还有Nacos

半路雨歌 2020-12-17
1832

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

Nacos 配置管理集成

  1. pom.xml 中添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

复制
  1. 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 端口也不能省略。

  1. 访问配置

在程序中可通过 @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 注解

  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) 文件中。

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

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。

---
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. 默认使用 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'}]

复制
  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,如下

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
配置内容的编码字符集
namespacepublic命名空间,用于隔离管理
groupDEFAULT_GROUPDataId 所在 group
fileExtensionpropertiesDataId 的后缀或扩展名,支持properties 或 yaml(yml)
timeout3000从 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),其优先级按默认-自定义-共享依次降低。


推荐阅读:

1. Spring Cloud(五):服务配置管理中心
2. Spring Cloud(八):使用Spring Cloud Bus来实现配置动态更新
3. Spring Cloud(九):服务发现,除了Eureka,还有Nacos


作者:雨歌

微信扫描二维码,关注公众号及时获取最新分享

点个在看,支持作者


文章转载自半路雨歌,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论