03.Nacos组件之统一配置中心

Posted 潮汐先生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了03.Nacos组件之统一配置中心相关的知识,希望对你有一定的参考价值。

前言

前面我们提到过Nacos是alibaba提供的既可以作为服务注册中心也可以作为统一配置中心的组件。上一节我们已经了解了其作为服务注册中心简单使用,下面我们来学习一下Nacos作为统一配置中心的简单使用。

介绍

之前我们介绍springcloud的统一配置中心组件config的时候,我们知道各服务节点的配置文件是放在远程Git仓库中的,Config Server拉取远程仓库里面的配置文件到本地之后通过负载均衡策略提供给Config Client。

Nacos则不然!相较于Spring Cloud Config,client端的配置文件不需要放在远程仓库中,而是放在Nacos Server中。我们可以在Nacos的管理界面查看client的配置文件,如下图①

核心概念

Nacos中有三个核心概念:命名空间、Data ID、Group,分别对应上面的②、③、④。对于不同公司或者不同人对于这三个概念的理解和使用略有差别,但归根结底都是用来区分项目或者服务的。

命名空间

Nacos中将命名空间单独作为一个菜单,提供了一个默认的保留空间public,默认最大的配置数是200。如下图所示:

默认的保留空间public是不可以编辑、删除的;

每一个命名空间对应一个唯一的ID,Nacos Client的预配置文件中配置命名空间时用到的就是这个ID;

这里我们将命名空间用作隔离每个项目配置文件的作用来使用,我们新建一个命名空间:STUDY,如下图

Group

我们站在项目中的每个服务的角度来看,Group的作用就是用来隔离每个项目中不同服务的配置文件,通常我们将一个服务归为一个Group。同样的Nacos提供了一个默认Group–DEFAULT_GROUP

如果我们不想使用默认的分组可以在新建项目配置文件的时候修改分组名称。

Data ID

Data ID是获取一个配置文件的唯一标识,通常我们以配置文件的文件名来命名。同一个命名空间的同一个分组下面的Data ID是不能重复的,这样通过namespace + Group + Data ID的组合就可以唯一确定一个配置文件。

configclient-profile.properties

我们在配置列表页面右上角点击+打开新建配置文件页面,如下图

按照下图内容所示添加configclient-dev.properties,最后点击发布即可

发布成功后我们可以在配置列表中看到我们刚才创建的配置文件

如果有多个命名空间的话创建配置文件之前记得先选择命名空间

同样我们新建配置文件configclient-prod.properties,如下图

返回配置文件列表可以看到configclient-dev.propertiesconfigclient-prod.properties,这样我们后面Config Client所需要的两个配置文件就准备完毕了

在上述两个配置文件中加上spring.cloud.nacos.discovery.namespace=50c32b33-b5e8-48ac-a731-7dbb556301f8,作用是指定当前服务注册到STUDY命名空间。否组默认注册到PUBLIC。

Config Client开发

1.新建Module

2.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">
    <parent>
        <artifactId>springcloud_alibaba_parent</artifactId>
        <groupId>com.christy</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>02.springcloud_alibaba_config_client</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--nacos client-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!--nacos config client-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
</project>

3.bootstrap.properties

# 告诉config server地址
spring.cloud.nacos.config.server-addr=192.168.8.120:8848

# 告诉从哪个命名空间获取配置
spring.cloud.nacos.config.namespace=50c32b33-b5e8-48ac-a731-7dbb556301f8
# 告诉从哪个组进行配置获取
spring.cloud.nacos.config.group=CONFIG_CLIENT

# 第一种获取配置文件方式 dataId = name + file-extension
# 从这个组中拉取那个配置文件
spring.cloud.nacos.config.name=configclient-prod
# 拉取这个配置那个后缀的配置文件
spring.cloud.nacos.config.file-extension=properties

# 第二种获取配置文件方式 dataId = prefix + env + file-extension
# spring.cloud.nacos.config.prefix=configclient
# spring.profiles.active=prod
# spring.cloud.nacos.config.file-extension=properties

4.ConfigClientApplication.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author Christy
 * @Date 2021/7/22 10:31
 **/
@SpringBootApplication
public class ConfigClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApplication.class, args);
    }
}

5.TestController.java

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author Christy
 * @Date 2021/7/22 10:33
 **/
@RestController
@RequestMapping("/test")
@RefreshScope
public class TestController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

    @Value("${customer.username}")
    private String username;

    @RequestMapping("/hello")
    public String sayHello() {
        log.info("Hello," + username);
        return "Hello," + username;
    }
}

@RefreshScope不要忘记加了,Nacos另外一个比较强大的功能就是通过这个注解可以自动实现刷新配置文件,而不需要像SpringCloud Config那样通过Bus+webHook的方式来实现自动刷新配置文件

6.测试

我们启动服务,在浏览器输入http://localhost:8811/test/hello。由于我们访问的prod的配置文件,所以页面显示Hello,Christy。如下图:

我们修改configclient-prod.properties配置文件中的username,再次访问结果如下:

当我们修改username的时候,控制台会显示出修改的键,再次访问浏览器结果也会显示出刷新后的值

历史版本

Nacos也可以像git远程仓库一样记录配置文件每次修改的记录,我们可以在配置管理-历史版本中输入Data ID和Group进行查询

我们可以查看每个版本的具体配置,也可以选择后面的回滚按钮回滚到指定版本,比如我们回滚到上个版本

点击回滚配置后我们在浏览器中再次访问http://localhost:8811/test/hello,输出结果也回到了上个版本,而且回滚的时候控制台也打印出了刷新的键

本系列专题源码已经上传至gitee:https://gitee.com/tide001/springcloud_parent,欢迎下载交流

以上是关于03.Nacos组件之统一配置中心的主要内容,如果未能解决你的问题,请参考以下文章

Nacos.02.组件之统一配置中心

12.统一配置中心Config自动刷新组件之Bus

12.统一配置中心Config自动刷新组件之Bus

11.Config统一配置中心之手动刷新

11.Config统一配置中心之手动刷新

Spring Boot 入门微服务之 Config Server 统一配置中心