Nacos配置中心

概述

  1. 可以使用Nacos来替代Consul作为配置中心。
  2. 官网:https://nacos.io/docs/v3.0/ecology/use-nacos-with-spring-cloud/?spm=5238cd80.2ef5001f.0.0.3f613b7ckMC2kq
  3. Spring Cloud Alibaba官网:https://sca.aliyun.com/docs/2023/user-guide/nacos/quick-start/?spm=5176.29160081.0.0.74805c728Gayt0

案例演示

新建模块

新建模块:cloudalibaba-config-nacos-client3377

image.png

修改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文件

  1. Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
  2. 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);
    }
}

业务类

  1. 创建NacosConfigClientController进行测试
  2. 在控制器类加入@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

image.png

Nacos添加配置

  1. 本案例的spring.application.namenacos-config-client
  2. 本案例的spring.profile.activedev
  3. 本案例的spring.cloud.nacos.config.file-extensionyaml
  4. 所以本案例的DataID是:nacos-config-client-dev.yaml
image.pngimage.png

测试

image.png

自动刷新

修改Nacos中的配置,重新请求该接口。

image.pngimage.png

历史配置

Nacos会记录配置文件的历史版本默认保留30天,此外还有一键回滚功能,回滚操作将会触发配置更新。

image.png

Namespace-Group-DataId

问题引入

  1. 实际开发中,通常一个系统会准备:dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?
  2. 一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…。那怎么对这些微服务配置进行分组和命名空间管理呢?

配置隔离

  1. 官网:https://nacos.io/en/blog/faq/nacos-user-question-history8215/?spm=5238cd80.f4e30d4.0.0.617e4844blFe26&source=wuyi#_top
  2. 默认情况:Namespace=public,Group=DEFAULT_GROUP
image.png

三种方案加载配置

DataID方案

使用默认空间public,默认分组DEFAULT_GROUP,指定spring.profile.active和配置文件的DataID来使不同环境下读取不同的配置。

Nacos新建配置
image.pngimage.png
修改application.yml
server:
  port: 3377
 
spring:
  profiles:
    #active: dev # 表示开发环境
    #active: prod # 表示生产环境
    active: test # 表示测试环境
测试
image.png

Group方案

使用默认空间public,指定不同的GROUP和DataId

Nacos新建配置
image.pngimage.png
修改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.yml
server:
  port: 3377
 
spring:
  profiles:
    #active: dev # 表示开发环境
    active: prod # 表示生产环境
    #active: test # 表示测试环境
测试
image.png

Namespace方案

通过Namespace实现命名空间环境区分。

新建Namespace:Prod_Namespace
image.pngimage.png
新建Namespace但命名空间ID不填(系统自动生成):Prod2_Namespace
image.pngimage.png
选择命名空间后,新建配置
image.pngimage.pngimage.pngimage.png
修改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.yml
server:
  port: 3377
 
spring:
  profiles:
    #active: dev # 表示开发环境
    active: prod # 表示生产环境
    #active: test # 表示测试环境
测试
image.png

相关文章

评论区