Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,当配置修改时能获取到最新数据。
也可以通过配置 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
profile 的配置文件 大于 默认配置的文件。 并且形成互补
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace}
配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
Group是组织配置的维度之一。通过一个有意义的字符串(如 Buy 或 Trade )对配置集进行分组,从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT_GROUP 。
配置分组的常见场景:不同的应用或组件使用了相同的配置类型,如 database_url 配置和MQ_topic 配置。
在没有明确指定 ${spring.cloud.nacos.config.group}
配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
Data ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848# config external configuration
# 1、Data Id 在默认的组 DEFAULT_GROUP,不支持配置的动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=ext-config-common01.properties# 2、Data Id 不在默认的组,不支持动态刷新
spring.cloud.nacos.config.extension-configs[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.extension-configs[1].group=GLOBALE_GROUP# 3、Data Id 既不在默认的组,也支持动态刷新
spring.cloud.nacos.config.extension-configs[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.extension-configs[2].group=REFRESH_GROUP
spring.cloud.nacos.config.extension-configs[2].refresh=true
可以看到:
多个 Data Id 同时配置时,它的优先级关系是
spring.cloud.nacos.config.extension-configs[n].data-id
其中 n 的值越大,优先级越高。
spring.cloud.nacos.config.extension-configs[n].data-id
的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。
此时spring.cloud.nacos.config.file-extension
的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=GROUP_APP1# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true
可以看到:
spring.cloud.nacos.config.shared-configs[n].data-id
来支持多个共享 Data Id 的配置。spring.cloud.nacos.config.shared-configs[n].group
来配置自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。spring.cloud.nacos.config.shared-configs[n].refresh
来控制该Data Id在配置变更时,是否支持应用中动态刷新,默认false。Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
spring.cloud.nacos.config.shared-configs[n].data-id
支持多个共享 Data Id 的配置spring.cloud.nacos.config.extension-configs[n].data-id
的方式支持多个扩展 Data Id 的配置当三种方式共同使用时,他们的一个优先级关系是:A 完全关闭配置
通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config
升级版本 (注意版本对应关系)
<dependencyManagement><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-dependenciesartifactId><version>2.6.3version><type>pomtype><scope>importscope>dependency><dependency><groupId>org.springframework.cloudgroupId><artifactId>spring-cloud-dependenciesartifactId><version>2021.0.1version><type>pomtype><scope>importscope>dependency><dependency><groupId>com.alibaba.cloudgroupId><artifactId>spring-cloud-alibaba-dependenciesartifactId><version>2021.0.1.0version><type>pomtype><scope>importscope>dependency>
dependencyManagement>
注意事项&#xff1a; spring-cloud-starter-alibaba-nacos-config
模块移除了 spring-cloud-starter-bootstrap
依赖&#xff0c;如果你想以旧版的方式使用&#xff0c;你需要手动加上该依赖&#xff0c;现在推荐使用 spring.config.import
方式引入配置
完成以上步骤就能无缝切换到 spring cloud alibaba 2021.0.1.0
版本
bootstrap.yml
)&#xff0c;升级到新版本应该怎么配置呢# bootstrap.yml
spring:cloud:nacos:config:name: test.ymlgroup: DEFAULT_GROUPserver-addr: 127.0.0.1:8848extension-configs:- dataId: test01.ymlgroup: group_01- dataId: test02.ymlgroup: group_02refresh: false
这两个配置是等价的
# application.yml
spring:cloud:nacos:config:group: DEFAULT_GROUPserver-addr: 127.0.0.1:8848config:import:- optional:nacos:test.yml # 监听 DEFAULT_GROUP:test.yml- optional:nacos:test01.yml?group&#61;group_01 # 覆盖默认 group&#xff0c;监听 group_01:test01.yml- optional:nacos:test02.yml?group&#61;group_02&refreshEnabled&#61;false # 不开启动态刷新- nacos:test03.yml # 在拉取nacos配置异常时会快速失败&#xff0c;会导致 spring 容器启动失败
注意事项:
如果使用 spring.config.import
就不能使用 bootstrap.yml/properties 引入配置的方式了 !!!
如果引入了 spring-cloud-starter-alibaba-nacos-config
&#xff0c;并且使用 import 方式导入配置,项目启动时会自动检测是否引入了 nacos:
条目&#xff0c;如果没有 import nacos 条目&#xff0c;会出现如下错误&#xff1a;
The spring.config.import property is missing a nacos: entry
Action:
Add a spring.config.import&#61;nacos: property to your configuration.If configuration is not required add spring.config.import&#61;optional:nacos: instead.To disable this check, set spring.cloud.nacos.config.import-check.enabled&#61;false.
你可以手动通设置 spring.cloud.nacos.config.import-check.enabled&#61;false
关闭它&#xff0c;但是不建议这么做&#xff0c;这个功能可以帮助你检查是否引入多余依赖
spring-cloud-starter-bootstrap
依赖&#xff0c;不需要修改一行代码本次使用版本&#xff1a;
Spring Cloud Alibaba 版本 | Spring Cloud 版本 | Spring Boot 版本 |
---|---|---|
2021.1 | 2021.0.1 | 2.6.4 |
<dependency><groupId>com.alibaba.cloudgroupId><artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
server:port: 8090spring:cloud:nacos:discovery:group: PROVIDER_GROUPconfig:group: PROVIDER_CONFIG_GROUPserver-addr: 127.0.0.1:8848config:import:- optional:nacos:provider-config-dev.yml # 监听 PROVIDER_GROUP :provider-config-dev.yml
# - optional:nacos:provider-config-dev.yml?group&#61;group_01 # 覆盖默认 group&#xff0c;监听 group_01:provider-config-dev.yml
# - optional:nacos:provider-config-dev.yml?group&#61;group_02&refreshEnabled&#61;false # 不开启动态刷新- nacos:provider-config-dev.yml # 在拉取nacos配置异常时会快速失败&#xff0c;会导致 spring 容器启动失败application:name: nacos-provider
&#64;Configuration
&#64;ConfigurationProperties(prefix &#61; "configdata")
public class UserConfig {private String name;private Integer age;// 省略get/set方法
}
provider-config-dev.yml:
这个配置文件其实可以不必在项目中配置&#xff0c;在nacos中配置即可&#xff0c;下面会说到
configdata:age: 21name: freeman