1、概念
命名空间(namespace):用于不同环境的配置隔离,例如开发环境、测试环境、生产环境。不同的命名空间下,可以存在相同名称的配置分组(Group)或配置集(Data ID)。默认的命令空间是public
配置分组(Group):配置分组是对配置集进行分组。不同的配置分组下可以有相同的配置集(Data ID)。当在 Nacos 上创建一个配置时,如果未填写配置分组的名称,则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,例如:学生管理系统的配置集可以定义一个group为:STUDENT_GROUP。
配置集体(Data ID):在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息。每个项目下往往有若干个工程,每个Data ID是一个工程的主配置文件。
2、详解
新建一个SpringBoot工程:study-nacos (要注意SpringCloud与SpringBoot的版本对应关系)
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.apple.study</groupId>
<artifactId>study-nacos</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>study-nacos</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties:
server.servlet.context-path=/nacos
server.port=8888
bootstrap.properties:
spring.application.name=express
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.profiles.active=dev
spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.namespace=${spring.profiles.active}
spring.cloud.nacos.config.group=wms
此时,该springboot项目会去127.0.0.1 nacos server中找namespace=dev、group=wms、Data ID=express-dev.properties的配置信息。
解释:
在 Nacos Spring Cloud 中,
dataId
的完整格式如下:${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
在nacos server中新建一个命名空间:dev
在dev命名空间下新建一个配置:Data Id=express-dev.properties Group=wms 配置项:yto.url=http://yto.com
现在来写一个测试的Controller: TestNacosController.java
@RestController
public class TestNacosController {
@Value("${yto.url}")
private String ytoUrl;
@RequestMapping("getConfigs")
public String getConfigs(){
return ytoUrl;
}
}
启动项目,访问http://localhost:8888/nacos/getConfigs
返回:http://yto.com
读取配置成功
注意:
如果项目中没有指定Group与Namespace,那么回到默认的public命名空间下的默认组DEFAULT_GROUP查找配置
假设:spring.profiles.active=dev,spring.application.name=express
如果找到了express-dev.properties,那么会引用该配置,否则去找express.properties的配置,否则报错
当 spring.profiles.active 为空,dataId 的拼接格式变成 ${prefix} . ${file-extension}
当 spring.profiles.active 不为空,没找到 ${prefix} - ${spring.profiles.active} . ${file-extension},会找 ${prefix} . ${file-extension}
3、配置自动刷新
我们修改nacos server中的配置如下:
yto.url=http://yto.com.cn.dev
发布配置后,再次访问http://localhost:8888/nacos/getConfigs,发现还是返回http://yto.com.cn
通过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新
@RestController
@RefreshScope
public class TestNacosController {
@Value("${yto.url}")
private String ytoUrl;
@RequestMapping("getConfigs")
public String getConfigs(){
return ytoUrl;
}
}
此时我们修改nacos server中的配置项,都会立即得到最新的配置。