本章将通过在 Spring Cloud 中集成 Nacos,并且通过配置扩展引入多个配置。
打开 Nacos 页面,在 dev 命名空间下添加一个名为 “public1”、“public2”、 “nacos_spring_cloud” 的配置集,如下图:

其中,public1 配置集内容如下:
name: public1
key1: value1
age: 20public2 配置集内容如下:
name: public2
key2: value2
age: 30nacos_spring_cloud 配置集内容如下:
name: nacos_spring_cloud使用 IDEA 创建 Spring Boot 项目,项目结构如下:

添加 Spring Cloud 和 Spring Cloud Alibaba 依赖到项目 pom.xml 中,如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.hxstrive.nacos</groupId>
<artifactId>springcloud_alibaba_nacos</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>nacos_spring_cloud2</artifactId>
<name>nacos_spring_cloud2</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 导入所有依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Spring Boot Begin -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Spring Boot End -->
<!-- Spring Cloud Begin -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Spring Cloud End -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>在项目的 resources 目录下面创建一个 bootstrap.yaml 配置文件,内容如下:
server:
port: 8080
spring:
application:
# 应用名称,用来匹配 Nacos 中的配置集
# 默认将根据下面指定的 spring.cloud.config.namespace + spring.cloud.config.group + spring.application.name + file-extension
# 进行匹配,例如:当前应用将匹配
# 8719efd1-94a6-49f7-9846-2debd66f6c0f 命名空间中 DEFAULT_GROUP 分组下
# 名为 nacos_spring_cloud 且格式为 yaml 的配置集
name: nacos_spring_cloud
cloud:
nacos:
config:
# Nacos 服务地址
server-addr: 127.0.0.1:8848
# Nacos 配置文件扩展名
file-extension: yaml
# Nacos 命名空间ID
namespace: 8719efd1-94a6-49f7-9846-2debd66f6c0f
# Nacos 分组
group: DEFAULT_GROUP
# Nacos 登录账号
username: nacos
# Nacos 登录密码
password: nacos
# 配置扩展
extension-configs:
# 如果指定 group,则默认在 DEFAULT_GROUP 组
# 注意:扩展配置的 data-id 必须和 Nacos 中的 data ID 保持一直
- data-id: public1.yaml
group: DEFAULT_GROUP
# refresh 用来指定是否支持自动刷新
- data-id: public2.yaml
group: DEFAULT_GROUP
refresh: true创建 BootstrapApp 类,该类其实就是一个简单的 Spring Boot 启动类,并且将该类声明为一个简单的控制器,提供一个 get 方法,用来获取 name 配置信息。代码如下:
package com.hxstrive.nacos;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 入口类
* @author hxstrive.com
*/
@SpringBootApplication
@RestController
@RequestMapping("/config")
public class BootstrapApp {
public static void main(String[] args) {
SpringApplication.run(BootstrapApp.class, args);
}
@Value("${name}")
private String name;
@GetMapping("/get")
public String get() {
return name;
}
}和运行 Spring Boot 项目一样,项目启动成功后,使用浏览器访问 http://localhost:8080/config/get 地址访问配置信息,如下图:

从上图输出可知:
(1)成功将 public1.yaml 和 public2.yaml 配置加载到项目,见 key1、key2 可知;
(2)public1.yaml、public2.yaml 和 nacos_spring_cloud.yaml 三个配置文件,nacos_spring_cloud.yaml 优先级最高,见 name 可知;
(3)public1.yaml、public2.yaml 两个扩展配置,其中数组下标越大优先级越高,见 age = 30 可知,它来源 public2.yaml;
如果我们再创建一个 nacos_spring_cloud.yaml 配置集(刚好等于服务名 + 文件扩展),内容如下:
name: nacos_spring_cloud.yaml重启应用,输出如下:

从上图输出可知,nacos_spring_cloud.yaml 配置集优先级大于 nacos_spring_cloud 配置优先级。
另外,Nacos 除了提供 extension-configs 扩展配置,还提供了 shared-configs 共享配置。Nacos 中并未对 extension-configs 和 shared-configs 的差别进⾏详细阐述。我们从他们的结构,看不出本质差别;除了优先级不同以外(extension-configs 优先级大于 shared-configs,在 shared-configs 之后加载),也没有其他差别。那么,Nacos 项⽬组为什么要引⼊两个类似的配置呢?我们可以从当初该功能的需求(issue)上找到其原始⽬的:
(1)主配置是应⽤专有的配置,主配置应当在 dataId 上要区分,同时最好还要有 group 的区分,因为 group 区分应⽤。
(2)要在各应⽤之间共享⼀个配置,请使⽤上⾯的 shared-configs,shared-configs 指定的配置,本来应该是不指定 group 的,也就是应当归⼊ DEFAULT_GROUP 这个公共分组。
(3)如果要在特定范围内(⽐如某个应⽤上)覆盖某个共享 dataId 上的特定属性,请使⽤ extension-config
下面是一个示例:
spring:
application:
name: nacos-config-multi
main:
allow-bean-definition-overriding: true
cloud:
nacos:
username: ${nacos.username}
password: ${nacos.password}
config:
server-addr: ${nacos.server-addr}
namespace: ${nacos.namespace}
# 用于共享的配置文件
shared-configs:
- data-id: common-mysql.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-redis.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
- data-id: common-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
# 常规配置文件
# 优先级大于 shared-configs,在 shared-configs 之后加载
extension-configs:
- data-id: nacos-config-advanced.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true
- data-id: nacos-config-base.yaml
group: SPRING_CLOUD_EXAMPLE_GROUP
refresh: true其中:
(1)主配置 > 扩展配置(extension-configs) > 共享配置 (shared-configs)
(2)“服务名 + 文件扩展” 优先级大于 “服务名” 配置
(3)同为扩展配置,数组元素对应的下标越⼤,优先级越⾼,如:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0]。
(4)同为共享配置,数组元素对应的下标越⼤,优先级越⾼,如:shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]。