Nacos配置中心
概述
- 可以使用Nacos来替代Consul作为配置中心。
 - 官网:https://nacos.io/docs/v3.0/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.2ef5001f.0.0.3f613b7ckMC2kq
 - Spring Cloud Alibaba官网:https://sca.aliyun.com/docs/2023/user-guide/nacos/quick-start/?spm=5176.29160081.0.0.74805c728Gayt0
 
案例演示
新建模块
新建模块:
cloudalibaba-config-nacos-client3377
修改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.sun.cloud</groupId> <artifactId>cloud2025</artifactId> <version>1.0-SNAPSHOT</version> </parent> <artifactId>cloudalibaba-config-nacos-client3377</artifactId> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!--bootstrap--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--web + actuator--> <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> <!--lombok--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
修改yaml文件
- Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
 - SpringBoot中配置文件的加载是存在优先级顺序的,
 bootstrap优先级高于application。
bootstrap.yml
# nacos配置 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 # nacos端配置文件DataId的命名规则是: # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # 本案例的DataID是:nacos-config-client-dev.yaml
application.yml
server: port: 3377 spring: profiles: active: dev # 表示开发环境 #active: prod # 表示生产环境 #active: test # 表示测试环境
主启动类
package com.sun.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class NacosConfigClient3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClient3377.class, args); } }
业务类
- 创建
 NacosConfigClientController进行测试- 在控制器类加入
 @RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。package com.sun.cloud.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RefreshScope // 在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。 public class NacosConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
Nacos中添加配置
Nacos中的匹配规则
Nacos中的
dataId的组成格式及与SpringBoot配置文件中的匹配规则,参见文档:https://nacos.io/docs/v3.0/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.2ef5001f.0.0.3f613b7ckMC2kq
Nacos添加配置
- 本案例的
 spring.application.name:nacos-config-client- 本案例的
 spring.profile.active:dev- 本案例的
 spring.cloud.nacos.config.file-extension:yaml- 所以本案例的DataID是:
 nacos-config-client-dev.yaml
测试
自动刷新
修改
Nacos中的配置,重新请求该接口。
历史配置
Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新。
Namespace-Group-DataId
问题引入
- 实际开发中,通常一个系统会准备:dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
 - 一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…。那怎么对这些微服务配置进行分组和命名空间管理呢?
 
配置隔离
- 官网:https://nacos.io/en/blog/faq/nacos-user-question-history8215/?spm=5238cd80.f4e30d4.0.0.617e4844blFe26&source=wuyi#_top
 - 默认情况:Namespace=public,Group=DEFAULT_GROUP
 
三种方案加载配置
DataID方案
使用默认空间public,默认分组DEFAULT_GROUP,指定
spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置。Nacos新建配置修改application.ymlserver: port: 3377 spring: profiles: #active: dev # 表示开发环境 #active: prod # 表示生产环境 active: test # 表示测试环境测试
Group方案
使用默认空间public,指定不同的GROUP和DataId
Nacos新建配置修改bootstrap.yml# nacos配置 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 group: PROD_GROUP #指定分组 # nacos端配置文件DataId的命名规则是: # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # 本案例的DataID是:nacos-config-client-dev.yaml修改application.ymlserver: port: 3377 spring: profiles: #active: dev # 表示开发环境 active: prod # 表示生产环境 #active: test # 表示测试环境测试
Namespace方案
通过Namespace实现命名空间环境区分。
新建Namespace:Prod_Namespace新建Namespace但命名空间ID不填(系统自动生成):Prod2_Namespace选择命名空间后,新建配置修改bootstrap.yml# nacos配置 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #Nacos服务注册中心地址 config: server-addr: localhost:8848 #Nacos作为配置中心地址 file-extension: yaml #指定yaml格式的配置 group: PROD_GROUP #指定分组 namespace: Prod_Namespace #指定命名空间 # nacos端配置文件DataId的命名规则是: # ${spring.application.name}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension} # 本案例的DataID是:nacos-config-client-dev.yaml修改application.ymlserver: port: 3377 spring: profiles: #active: dev # 表示开发环境 active: prod # 表示生产环境 #active: test # 表示测试环境测试























