Nacos 注册中心与配置中心
概述
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 是 Dynamic Naming and Configuration Service 的缩写,动态命名和配置服务。正如其名,Nacos 是阿里开源的集注册中心、配置中心为一体的服务。
安装
安装完成后访问 localhost:8848/nacos UI 界面如下:

Nacos 概念
Nacos 数据模型 Key 由三元组唯一确认

- 作为注册中心时,Namespace + Group + Service
- 作为配置中心时,Namespace + Group + DataId
Namespace 命名空间
提供分布式系统中所有对象(Object)、实体(Entity)的名字到关联的元数据之间的映射管理服务,用于进行租户粒度的配置隔离。默认为 public(公共命名空间),上面使用了 dev 命名空间
不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 最常用场景是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
创建命名空间


Group 服务分组
Nacos 中的一组配置集,是组织配置的维度之一。不同的服务可以归类到同一分组。默认为 DEFAULT_GROUP(默认分组)
配置集
一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置集 ID:配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。
Service 服务
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。对应我们的服务实例,比如我们创建的用户服务、订单服务、商品服务等等。
Service 可以进一步细拆服务领域模型

Instance 实例:提供一个或多个服务的具有可访问网络地址(IP:Port)的进程。打包成 jar 后, 运行起来就是一个实例,多运行几个就多几个实例
Cluster 集群:同一个服务下的所有服务实例组成一个默认集群(Default)。集群可以被进一步按需求划分,划分的单位可以是虚拟集群。(如将服务部署在多个机房之中,每个机房可以创建为一个虚拟集群。每个服务在注册到 Nacos 时,设置所在机房的虚拟集群。这样,服务在调用其它服务时,可以通过虚拟集群,优先调用本机房的服务,在提升服务的可用性的同时,保证了性能。)
Metadata 元数据:元数据(如配置和服务)描述信息,如服务版本、权重、容灾策略、负载均衡策略、鉴权配置、各种自定义标签 (label)。从作用范围来看,分为服务级别的元信息、集群的元信息及实例的元信息。


以 Nacos 元数据的服务版本举例子。当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。可以按照以下的步骤进行版本迁移:
- 在低压力时间段,先升级一半提供者为新版本
- 再将所有消费者升级为新版本
- 然后将剩下的一半提供者升级为新版本
Nacos 元数据的鉴权配置举例子。通过令牌验证在注册中心控制权限,以决定要不要下发令牌给消费者,可以防止消费者绕过注册中心访问提供者。另外,通过注册中心可灵活改变授权方式,而不需修改或升级提供者。

Health Check 健康检查:以指定方式检查服务下挂载的实例的健康度,从而确认该实例是否能提供服务。根据检查结果,实例会被判断为健康或不健康。对服务发起解析请求时,不健康的实例不会返回给客户端。
- 健康保护阈值:为了防止因过多实例不健康导致流量全部流向健康实例,继而造成流量压力把健康实例实例压垮并形成雪崩效应,应将健康保护阈值定义为一个 0 到 1 之间的浮点数。当域名健康实例占总服务实例的比例小于该值时,无论实例是否健康,都会将这个实例返回给客户端。这样做虽然损失了一部分流量,但是保证了集群的剩余健康实例能正常工作。
服务中心
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。
注册中心原理

注册中心一共有三种角色
- 服务提供者(Service Provider):启动时,向注册中心注册自己为一个服务(Service)的实例(Instance),而后定期向 Registry 发送心跳,告诉自己还存活。在关闭时,向 Registry 取消注册。
- 服务消费者(Service Consumer):启动时,向注册中心订阅使用到的服务,并缓存服务的实例列表在内存中。当 Consumer 向对应服务的 Provider 发起调用时,从内存中的该服务的实例列表选择一个,进行远程调用。关闭时,向 Registry 取消订阅。
- 注册中心(Registry):Provider 超过一定时间未心跳时,从服务的实例列表移除。服务的实例列表发生变化(新增或者移除)时,通知订阅该服务的 Consumer,从而让 Consumer 能够刷新本地缓存。
不同的注册中心可能在实现原理上会略有差异。Eureka 并不提供通知功能,而是 Eureka Client 定期轮询(所以注册中心挂了的时候,很小一段时间内可能服务还是能访问得到),实现本地缓存的更新。
Provider 和 Consumer 只是角色上的定义,一个服务同时即可以是 Provider 也可以作为 Consumer。例如说,优惠劵服务可以给订单服务提供接口,同时又调用用户服务提供的接口。
演示
引入依赖
这里 Consumer 与 Provider 依赖都相同的
可以创建一个专门管理 Maven 依赖的 BOM 清单,然后各个模块引入需要的依赖即可。
<properties>
<revision>2.3.0-SNAPSHOT</revision>
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
<!-- 统一依赖管理 -->
<spring.boot.version>3.3.4</spring.boot.version>
<spring.cloud.version>2023.0.3</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.1.2</spring.cloud.alibaba.version>
</properties>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
配置文件
Provider 配置
spring:
application:
name: provider-server # 应用名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 服务发现配置,对应 NacosDiscoveryProperties 配置类
namespace: dev # 命名空间。默认 Public,这里使用 dev 开发环境,需要在 nacos 界面创建一个 dev 的命名空间
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
Provider 工程
@SpringBootApplication // Springboot 标配
@EnableDiscoveryClient // 开启 Spring Cloud 的注册发现功能。不过从 Spring Cloud Edgware 版本开始,实际上已经不需要添加
public class DemoProviderApplication {
public static void main(String[] args) {
SpringApplication.run(DemoProviderApplication.class, args);
}
@RestController
static class TestController {
@GetMapping("/test")
public String test(String name) {
return "provider:" + name;
}
}
}
在 Spring Cloud Common 项目中,定义了 DiscoveryClient 接口,作为通用的发现客户端,提供读取服务和读取服务列表的 API 方法。而想要集成到 Spring Cloud 体系的注册中心的组件,需要提供对应的 DiscoveryClient 实现类。Spring Cloud Alibaba Nacos Discovery 提供了 NacosDiscoveryClient 实现。Eureka 也有对应的实现类。
运行以后,可以通过 Nacos 界面,看到对应的服务
Consumer 配置
spring:
application:
name: consumer-server # 应用名称
cloud:
nacos:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 服务发现配置,对应 NacosDiscoveryProperties 配置类
namespace: dev # 命名空间。默认 Public,这里使用 dev 开发环境,需要在 nacos 界面创建一个 dev 的命名空间
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
Consumer 工程
@SpringBootApplication
public class DemoConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConsumerApplication.class, args);
}
// 使用 RestTemplate 进行服务调用
@Configuration
public class RestTemplateConfiguration {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
static class TestController {
// Spring Cloud 的服务发现客户端,很好的解开对注册中心依赖,以后如果想用 Zookeeper 或者其他注册中心,完全不需要更改代码
@Resource
private DiscoveryClient discoveryClient;
// Spring 提供的 HTTP 调用模板工具类
@Resource
private RestTemplate restTemplate;
// 带有负载均衡的客户端,看名字就知道比 RestTemplate 多了负载均衡
// @Resource
// private LoadBalancerClient loadBalancerClient;
@GetMapping("/hello-world")
public String hello(String name) {
// 获得服务 `provider-server` 的一个实例
ServiceInstance instance;
// 获取服务 `provider-server` 对应的实例列表
List<ServiceInstance> instances = discoveryClient.getInstances("provider-server");
// 选择第一个
instance = instances.size() > 0 ? instances.get(0) : null;
// 发起调用
if (instance == null) {
// instance = loadBalancerClient.choose("provider-server");
throw new RuntimeException("获取不到实例");
}
String targetUrl = instance.getUri() + "/test?name=" + name;
String response = restTemplate.getForObject(targetUrl, String.class);
// 返回结果
return "consumer:" + response;
}
}
}
Spring Cloud Common 项目中,定义了LoadBalancerClient 接口,作为通用的负载均衡客户端,提供从指定服务中选择一个实例、对指定服务发起请求等 API 方法。而想要集成到 Spring Cloud 体系的负载均衡的组件,需要提供对应的 LoadBalancerClient 实现类。Spring Cloud Netflix Ribbon 提供了
RibbonLoadBalancerClient实现。
所有需要使用到的地方,只需要获取到 DiscoveryClient 客户端,而无需关注具体实现,保证其通用性。
服务消费者和服务提供是一种角色的概念,本质都是一种服务,都是可以注册自己到注册中心的。
通过访问 http://127.0.0.1:28080/hello-world?name=red ,返回结果为 consumer:provider:red 。这就是整套服务流程通了。然后关闭 provider-server 服务,可以发现 获取不到实例 异常
配置中心
Spring Cloud Alibaba 提供的 Spring Cloud Alibaba Nacos Config 组件,基于 Spring Cloud 的编程模型,接入 Nacos 作为配置中心,实现服务的统一配置管理。
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 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
演示
引入依赖
<!-- 根据上面基本的依赖配置,再引入配置中心依赖 -->
<properties>
<revision>2.3.0-SNAPSHOT</revision>
<flatten-maven-plugin.version>1.6.0</flatten-maven-plugin.version>
<!-- 统一依赖管理 -->
<spring.boot.version>3.3.4</spring.boot.version>
<spring.cloud.version>2023.0.3</spring.cloud.version>
<spring.cloud.alibaba.version>2023.0.1.2</spring.cloud.alibaba.version>
</properties>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 引入 SpringMVC 相关依赖,并实现对其的自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 Spring Cloud Alibaba Nacos Discovery 相关依赖,将 Nacos 作为注册中心,并实现对其的自动配置
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency> -->
<!-- 引入 Spring Cloud Alibaba Nacos Config 相关依赖,将 Nacos 作为配置中心,并实现对其的自动配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
创建 Nacos 配置集

添加配置内容

配置文件
创建 bootstrap.yml 配置文件(注意不是 application.yml),添加 Nacos Config 相关配置
spring:
application:
name: config-application # 应用名称
cloud:
nacos:
config: # Nacos Config 配置项,对应 NacosConfigProperties 配置属性类
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
namespace: dev # 使用的 Nacos 的命名空间,默认为 null,这里使用 dev
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP,后面有介绍
name: ${spring.application.name} # Nacos 配置集的 dataId,默认为 spring.application.name。要与配置中心名称一致
file-extension: yaml # 配置集的 dataId 的文件拓展名,也是配置集的配置格式,默认properties,要与创建时选的格式一致
创建配置项
@Data
@Component // 保证该配置类可以作为一个 Bean 被扫描到
@ConfigurationProperties(prefix = "test") // 设置 prefix = "test" 属性,这样它就可以读取前缀为 test 配置项,设置到配置类对应的属性上
// @NacosConfigurationProperties(prefix = "test", dataId = "${nacos.config.data-id}", type = ConfigType.YAML)
public class TestProperties {
private String name;
private Integer age;
}
@NacosConfigurationProperties 注解的在功能上是对标 @ConfigurationProperties 注解,用于将 Nacos 配置注入 POJO 配置类中。因为 Nacos Config 相关配置到 bootstrap.yaml 配置文件中,因此 Spring Cloud 应用在启动时,预加载了来自 Nacos 配置,所以可以直接使用 @ConfigurationProperties 注解即可。
Test Controller
@RestController
@RequestMapping("/test")
public class TestController {
@Resource
private TestProperties testProperties;
@Value(value = "${test.name}") // @NacosValue(value = "${test.name}")
private String name;
@Value(value = "${test.age}")
private Integer age;
/**
* 测试 @ConfigurationProperties 注解的配置属性类
*/
@GetMapping("/test-properties")
public TestProperties testProperties() {
return testProperties;
}
/**
* 测试 @Value 注解的属性
*/
@GetMapping("/test-value")
public Map<String, Object> testValue() {
return new JSONObject().fluentPut("name", name).fluentPut("age", age);
}
}
TestApplication
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class);
}
}
测试
访问 http://127.0.0.1:8080/test/test-properties 接口,测试 @ConfigurationProperties 注解的配置属性类
{
"name": "red",
"age": 30
}
配置加载说明
对于 Nacos Config 的配置加载,可以参考下 NacosPropertySourceLocator 的 loadApplicationConfiguration 方法:
private void loadApplicationConfiguration(
CompositePropertySource compositePropertySource, String dataIdPrefix,
NacosConfigProperties properties, Environment environment) {
String fileExtension = properties.getFileExtension();
String nacosGroup = properties.getGroup();
// load directly once by default
loadNacosDataIfPresent(compositePropertySource, dataIdPrefix, nacosGroup,
fileExtension, true);
// load with suffix, which have a higher priority than the default
loadNacosDataIfPresent(compositePropertySource,
dataIdPrefix + DOT + fileExtension, nacosGroup, fileExtension, true);
// Loaded with profile, which have a higher priority than the suffix
for (String profile : environment.getActiveProfiles()) {
String dataId = dataIdPrefix + SEP1 + profile + DOT + fileExtension;
loadNacosDataIfPresent(compositePropertySource, dataId, nacosGroup,
fileExtension, true);
}
}
Nacos 配置集的 dataId 为 {dataIdPrefix}、{dataIdPrefix}.{fileExtension}、${dataIdPrefix}-{profile}.{fileExtension} 三种情况,分别从 Nacos 中加载对应的配置集。同时要注意,优先级是反过来的,即优先级为 {dataIdPrefix}-{profile}.{fileExtension} > {dataIdPrefix}.{fileExtension} > {dataIdPrefix}。
按照在 bootstrap.yaml 配置文件中的配置,会加载的 Nacos 配置集的 dataId 为 config-application 和 config-application.yaml,并且优先级是 config-application.yaml > config-application。
为什么是 bootstrap.yml 而不是 application.yml 呢? Spring Cloud 应用中,会先创建一个 Bootstrap Context(引导上下文),比 Spring Boot 创建 Application Context(应用上下文)更早初始化。Bootstrap Context 新增了一个 bootstrap.yaml 配置文件,保证和 Application Context 的 application.yaml 配置文件的隔离。
有了配置文件的隔离之后,Spring Cloud 新定义了专属于 Bootstrap Context 的自动化配置类的拓展点 BootstrapConfiguration,和 Spring Boot 为 Application Context 的自动化配置类的拓展点 EnableAutoConfiguration 的隔离,保证两个 Context 创建各自的 Bean。以 Spring Cloud Alibaba Nacos 的 spring.factories 举例子,如下图所示

虽说 Bootstrap Context 和 Application Context 做了这么多隔离,但是它们有一点是共享的,那就是 Environment。在 Spring 中,我们通过 Environment 获取属性配置,如 spring.application.name 对应的值是多少。
Bootstrap Context 的主要目的是通过 Bootstrap Context 的优先初始化,将配置加载到 Environment 中,提供给后面的 Application Context 使用。
bootstrap.yaml 添加 Spring Cloud Alibaba Nacos Config 相关的配置,这样 Bootstrap Context 在初始化时,通过 NacosConfigBootstrapConfiguration 创建 Nacos 相关的 Bean,然后实现从 Nacos 配置中心加载配置到 Environment 中。
如果把 Spring Cloud Alibaba Nacos Config 相关的配置添加在 application.yml 中,那么可能无法保证 Nacos 相关的 Bean 被最先初始化,完成从 Nacos 获取配置,从而影响创建的 Bean。
实际上将 Spring Cloud Alibaba Nacos Config 相关的配置添加在 application.yaml 中也能解决,需要基于 Spring Boot 的 ApplicationContextInitializer 和 EnvironmentPostProcessor 拓展点,实现自定义的处理。
多环境配置
Nacos 可通过三种不同方式来配置多环境,但是首选的肯定是 namespace ,因为官方推荐,毕竟不是人人都有生产环境的配置管理的权限:
- 通过 Nacos namespace 命名空间可以为我们带来多环境配置
- 通过配置集的 dataId 来实现。如:开发环境使用 Nacos 配置集的 dataId 为
{applicationName}-dev,生产环境使用 Nacos 配置集的 dataId 为{applicationName}-prod。使用 Spring Cloud Alibaba Nacos Config 提供的 Profiles 功能,内置就提供在配置的 Nacos 配置集的 dataId 拼接 -{profile}。 - 通过配置集的 group 分组来实现。例如说:开发环境使用配置集的 group 为 DEV_GROUP,生产环境使用配置集的 group 为 PPROD_GROUP。(最不推荐)
自动刷新配置
上面已经实现从 Nacos 读取配置。那在应用已经启动的情况下,如果我们将读取的 Nacos 的配置进行修改时,应用是否会自动刷新本地的配置呢:使用 @ConfigurationProperties 注解的会,使用 @Value 注解的不会。
通过修改 Nacos 配置中心的配置,RefreshEventListener 会监听到已经修改的配置,但是可通过访问上面项目进行测试的时候,发现 @Value 的值并不会进行修改

@RefreshScope:Spring Cloud 中,提供了 @RefreshScope 注解,可以声明在 Bean 上,实现该 Bean 的配置刷新。
// 参考源码可以知道如何进行刷新
refresh() {
Map<String, Object> before = extract( // 提取标准参数(SYSTEM,JNDI,SERVLET)之外所有参数变量
this.context.getEnvironment().getPropertySources());
addConfigFilesToEnvironment(); // 把原来的Environment里的参数放到一个新建的Spring Context容器下重新加载,完事之后关闭新容器
Set<String> keys = changes(before, // 比较出变更项
extract(this.context.getEnvironment().getPropertySources())).keySet(); // 提起更新过的参数(排除标准参数)
this.context.publishEvent(new EnvironmentChangeEvent(keys)); // 发布环境变更事件,接收:EnvironmentChangeListener/LoggingRebinder
this.scope.refreshAll(); // RefreshScope用新的环境参数重新生成Bean
}
可将 TestController 加上 @RefreshScope 注解实现对 @Value 自动刷新
@RestController
@RequestMapping("/test")
@RefreshScope
public class TestController {
}
EnvironmentChangeEvent:通过 @ConfigurationProperties 或者 @Value + @RefreshScope 注解,已经能够满足我们绝大多数场景下的自动刷新配置的功能。但某些场景仍然需要实现对配置的监听,执行自定义的逻辑。如数据库连接的配置发生变更时,我们需要通过监听该配置的变更,重新初始化应用中的数据库连接,从而访问到新的数据库地址
Spring Cloud 中,在 Environment 的属性配置发生变化时,会发布 EnvironmentChangeEvent 事件。只需要实现 EnvironmentChangeEvent 事件的监听器,就可以进行自定义的逻辑处理。
// 实现自定义处理逻辑
@Component
public class TestEnvironmentChangeListener implements ApplicationListener<EnvironmentChangeEvent> {
private Logger logger = LoggerFactory.getLogger(getClass());
@Autowired
private ConfigurableEnvironment environment;
@Override
public void onApplicationEvent(EnvironmentChangeEvent event) {
for (String key : event.getKeys()) {
logger.info("[onApplicationEvent][key({}) 最新 value 为 {}]", key, environment.getProperty(key));
}
}
}
配置加载顺序
Nacos Config 提供了三种配置 Nacos 配置集的方式:
- 通过
spring.cloud.nacos.config.shared-configs配置项,支持多个共享 Nacos 配置集。 - 通过
spring.cloud.nacos.config.extension-configs配置项,支持多个拓展 Nacos 配置集。 spring.cloud.nacos.config.name配置项,支持一个 Nacos 配置集。
共同使用时,它们的优先级关系是:1 < 2 < 3。另外,1 和 2 的命名带有共享或是拓展,没有任何含义,只是优先级不同。
配置文件
spring:
application:
name: config-application
cloud:
nacos:
# Nacos Config 配置项,对应 NacosConfigProperties 配置属性类
config:
server-addr: 127.0.0.1:8848 # Nacos 服务器地址
namespace: # 使用的 Nacos 的命名空间,默认为 null
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
name: ${spring.application.name} # 使用的 Nacos 配置集的 dataId,默认为 spring.application.name
file-extension: yaml # 使用的 Nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
# 拓展配置集数组,对应 Config 数组
extension-configs:
- data-id: extension-dataId-1.yaml
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
refresh: true # 是否自动刷新配置,默认为 false
- data-id: extension-dataId-2.yaml
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
refresh: true # 是否自动刷新配置,默认为 false
# 共享配置集数组,对应 Config 数组
shared-configs:
- data-id: shared-dataId-1.yaml
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
refresh: true # 是否自动刷新配置,默认为 false
- data-id: shared-dataId-2.yaml
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
refresh: true # 是否自动刷新配置,默认为 false
profiles:
active: dev # 设置开启的 Profiles
启动类
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
// 启动 Spring Boot 应用
ConfigurableApplicationContext context = SpringApplication.run(TestApplication.class, args);
// 查看 Environment
Environment environment = context.getEnvironment();
System.out.println(environment);
}
}
可通过断点,查看对应的加载顺序

1375

被折叠的 条评论
为什么被折叠?



