Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)

Spring Cloud Alibaba 系列之 Nacos 篇(配置中心)

绿林寻猫
2023-07-26 / 2 评论 / 2,169 阅读 / 正在检测是否收录...

一、前言

上一篇 Spring Cloud Alibaba 系列之 Nacos 篇(服务注册与发现) 介绍了 Nacos 的服务注册与发现,本篇接续介绍其另一个功能--配置中心。

二、简单介绍

Nacos 提供用于存储配置和其他元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用 Spring Cloud Alibaba Nacos Config 就可以在 Nacos Server 集中管理 Spring Cloud 应用的外部属性配置。

2.1 实现目的

不使用配置中心之前,我们在管理项目配置会遇到如下问题:

这些问题通过使用 Nacos 的配置中心功能快捷、简便的解决。

2.2 基础概念

为了区分环境或项目间的配置,我们需要了解 Nacos 给出的如下3个概念:

三者关系如下图:
lkjdf24e.png

三、实战演练

首要条件就是启动 Nacos 的服务环境。我们使用上一篇文章搭建好的 Nacos 服务,不清楚的读者可以先移步至上一篇浏览前置内容。

3.1 基础配置

搭建名为 nacos-config 的springboot项目

🔧 第一步,添加依赖:

<?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>com.demo</groupId>
        <artifactId>nacos</artifactId>
        <version>1.0.0</version>
    </parent>
    <packaging>jar</packaging>
    <artifactId>nacos-config</artifactId>

    <description>
        配置中心
    </description>
    <properties>
        <java.version>1.8</java.version>
        <!--编译项目不生成测试类也不进行测试-->
        <maven.test.skip>true</maven.test.skip>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <!-- spring cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- spring cloud alibaba 依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

🔧 第二步,创建 bootstrap.propertiesbootstrap.yml 文件:

使用配置中心后,我们通常会把 application.propertiesapplication.yaml 中的配置移植到 Nacos 服务上,但项目连接配置中心服务需要单独配置,因此需要用到 bootstrap.propertiesbootstrap.yml 文件。

其中,这 4 种文件的加载顺序由高到低依次是:

我们的 bootstrap.yml 配置如下:

server:
  port: 38001
spring:
  application:
    # 应用名
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
#        namespace: public
        group: DEFAULT_GROUP
        file-extension: yaml # 配置格式(默认是 properties)
      # 连接注册中心的账号和密码 以下是默认账密
      username: nacos
      password: nacos

🔧 第三步,移植配置数据:

即将 application.properties 或 application.yml 中的业务配置数据移植到配置中心服务上。

本次演练,我们使用如下配置数据进行测试:

www:
    name: www.maven.vip
    

登录 Nacos 管理后台,管理配置 -> 配置列表,,操作如下图:
lkjdtctb.png
lkjdu209.png
lkjduoe1.png

在新建配置界面中, Data ID 通常对应 spring.application.name 的值 + (.properties 或 .yaml)。

数据配置格式,目前只支持 properties 和 yaml。

🔧 第四步,创建测试类:

用于封装上文在 Nacos 服务上配置的数据

@Data
@Component
@ConfigurationProperties(prefix = "www")
public class DataBaseConfig {
    private String name;
}

用于测试获取配置数据

@RestController
@RefreshScope
public class ConfigController {

    @Autowired
    private DataBaseConfig dataBaseConfig;

//    @Value注解可以获取到配置中心的值,但是无法动态感知修改后的值,需要利用@RefreshScope注解
    @Value("${www.name}")
    private String name;

    @RequestMapping("/getConfig")
    public String getConfig() {
        return dataBaseConfig.getName();
    }

    @RequestMapping("/getName")
    public String getName() {
        return name;
    }
}

接下来进行接口请求测试,启动项目,请求 🎈 http://127.0.0.1:38001/getConfig 结果如下图:
lkje21tu.png
成功请求获取配置中心的数据。

3.2 动态刷新

所谓动态刷新就是在不重启项目的基础上,修改配置中心的数据,项目能立即获取最新数据,接下来我们操作一遍:

将配置数据改成:

www:
    name: www.baidu.com

lkje4d2o.png
修改配置后,不重启项目,再次请求接口,成功获取修改后的配置数据。

3.3 环境隔离

项目开发一般分为,开发、测试、预发和生产这4个阶段,每个阶段都有对应的配置数据(数据库、redis、MQ 连接配置等),这些数据都各不相同,为了更好的区分和维护这些数据,环境隔离功能必不可少。

那配置中心如何做环境隔离呢?需要用到上文提到的命名空间,操作如下:

📍 第一步,登录 Nacos 管理后台,命名空间菜单,新建一个名为 TEST 的命名空间:
lkje6ljh.png
该命名空间就作为测试环境的专属空间。

📍 第二步,在新建的命名空间下,创建一个配置:

lkjeeky3.png

www:
    name: test

📍 第三步,修改项目中的 bootstrap.propertiesbootstrap.yml 文件,新增:

server:
  port: 38001
spring:
  application:
    # 应用名
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        #此处就是创建 TEST 命名空间生成的 id 值
        namespace: c716de35-9cb2-4c82-b86b-c74854ef726b
        group: DEFAULT_GROUP
        file-extension: yaml # 配置格式(默认是 properties)
      # 连接注册中心的账号和密码 以下是默认账密
      username: nacos
      password: nacos

最后,重启项目,请求接口,结果如下图:
lkjee1ba.png
成功请求 TEST 命名空间下的配置数据。

3.4 数据持久化

Nacos 默认情况下是采用 apache derby 内嵌数据库进行数据存储,在单机模式时可以使用 Nacos 嵌入式数据库实现数据存储,但是 derby 数据库不方便观察数据存储的基本情况,从 Nacos 0.7 版本开始增加了支持 mysql 数据源能力。

接下来,我们实现持久化功能。

📍 第一步,创建名为 nacos_config 的数据库,在 Nacos 的程序包下,有个 conf 目录,将里边的 nacos-mysql.sql 导入到新建的数据库中。

📍 第二步,修改 conf/application.properties 的数据库连接配置:

将注释打开:

spring.datasource.platform=mysql

db.num=1

# 注意修改数据库名、账号和密码
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=tiger

📍 第三步,重启 Nacos 服务,再次访问 http://localhost:8848/nacos ,如下图:
lkjeh60e.png

登录发现,之前配置的数据都消失,因为我们更换了存储源( MySQL )。现在数据库中的数据都是空的,在 Nacos 管理后台中,我们尝试新建一条配置:

database.url=abc
database.username=root
database.password=riger

保存后,查看数据库信息,如下图:
lkjei8l6.png
配置数据成功持久化。

3.5 集群部署

为保证配置中心的高可用性,集群部署是必不可少的整合方案。

我们在本地测试,将 Nacos 安装包拷贝成 3 份,在持久化模式的基础上,操作步骤如下:

📍 第一步,将 Nacos 程序包下的 conf/cluster.conf.example 改名为 conf/cluster.conf ,修改内容:

127.0.0.1:8801
127.0.0.1:8802
127.0.0.1:8803

📍 第二步,修改 3 份 Nacos 安装包下的 conf/application.properties 文件,将 server.port 依次改成 8801,8802,8803

保存后,启动 3 份 Nacos 即可:

cd nacos/bin

# windows 单机模式启动
startup.cmd

# linux/mac 
./startup.sh

注意,启动命令无需加 -m standalone 参数

引申问题: Nacos 做了集群,有 3 个访问地址,客户端如何配置请求呢?有 2 种请求方案:

  • 修改 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8801,127.0.0.1:8802,127.0.0.1:8803
  • 使用 Nginx 反向代理 Nacos 集群。

四、参考资料

📣 Nacos 官网

五、项目源码

📣 源码

0

评论 (2)

取消
  1. 头像
    风干
    Windows 10 · Google Chrome

    表情

    回复
  2. 头像
    自然风干
    Windows 10 · Google Chrome

    表情

    回复