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

前言

前面我们提到过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,欢迎下载交流

-------------------------以下内容2021-11-04日新增,跟以上内容不属于一个项目-------------------------

共享配置

在微服务架构中,我们会有很多服务。而每个微服务的配置文件中都需要配置像数据库连接服务注册之类的信息。如cloud-integral-prod.yml中的配置文件所示:

server:
  port: ${port:9031}
  datasource:
spring:
  application:
    name: cloud-integral #服务名称,必须,保证唯一
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 123456
      url: jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&characterEncoding=utf8&useSSL=false
      max-active: 10 # 连接池配置
  cloud:
    nacos:
      discovery:
        server-addr: www.nacos.com:80 #指定nacos-server的地址
        username: nacos
        password: nacos
        namespace: christy-prod #服务发布到指定的namespace,默认是public
        group: christy-prod-group #服务发布到指定的group,默认值是DEFAULT_GROUP

我们可以将这些重复的配置抽取出来放到单独的一个配置文件中,作为每个微服务的共享配置。我们新建一个配置文件common-prod.yml,内容如下:

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      username: root
      password: 123456
      url: jdbc:mysql://127.0.0.1:3306/nacos?useUnicode=true&characterEncoding=utf8&useSSL=false
      max-active: 10 # 连接池配置
  cloud:
    nacos:
      discovery:
        server-addr: www.nacos.com:80 #指定nacos-server的地址
        username: nacos
        password: nacos
        namespace: christy-prod #服务发布到指定的namespace,默认是public
        group: christy-prod-group #服务发布到指定的group,默认值是DEFAULT_GROUP

修改cloud-integral-prod.yml的配置文件如下(只留下自己所需要的配置信息):

spring:
  application:
    name: cloud-integral #服务名称,必须,保证唯一
server:
  port: ${port:9031}

这样我们在nacos的配置列表的命名空间christy-prod中会看到下面两个配置文件。如下图所示:
在这里插入图片描述
最后我们回到项目cloud-integral中,修改配置文件如下:

# 从配置中心加载配置文件
# 文件名是通过公式来拼接的${prefix}-${spring.profiles.active}.${file-extension}
spring:
  cloud:
    nacos:
      config:
        server-addr: www.nacos.com:80
        namespace: christy-prod
        group: DEFAULT_GROUP
        username: nacos
        password: nacos
        prefix: cloud-integral
        file-extension: yml
        # shared-configs:   # 加载共享配置文件
        #  - common-prod.yml
        # 该方法已经废弃,请使用shared-configs[x]
        # refreshable-dataids: common-prod.yml
        shared-configs[0]:
          data-id: common-prod.yml # 配置文件名-Data Id
          group: DEFAULT_GROUP   # 默认为DEFAULT_GROUP
          refresh: true   # 是否动态刷新,默认为false
  profiles:
    active: prod

这样我们不仅能够同时加载到以上两个配置文件,而且能实时同步更新修改的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潮汐先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值