初识微服务-nacos配置中心

配置中心

概述

配置中心是微服务中不可或缺的组件,因为如果没有配置中心,那么各个微服务的的配置信息无法得到统一和管理,会变得冗余。

:::color4

配置中心是用于管理应用程序配置信息的工具

  • 集中管理配置 :解决微服务架构下配置分散和冗余问题,将原本分散在各个服务节点的配置信息集中存储与管理 ,便于统一维护和管理,避免手动配置导致的不统一和不便。
  • 贯穿应用生命周期:应用启动和运行时,都需读取配置信息,配置中心提供配置读取功能,应用在启动时依配置初始化,运行中依配置调整行为。
  • 支持动态更新 :主流配置中心如 Spring Cloud Config、Apollo、Nacos 等,支持配置实时推送、版本管理、配置回滚等功能,可在不重启应用的情况下动态更新配置,提升运维效率和系统灵活性。
  • 适配多种环境:应用在开发、测试、生产等不同环境,以及不同集群中,配置需求不同,配置中心可进行完善的环境、集群配置管理,让同一程序在不同环境下按需加载配置。
  • 多语言和多部署方式支持: 满足不同技术栈和部署场景需求,主流配置中心大多支持多语言,且提供单机和分布式等多种部署方式。

:::

Nacos

安装Nacos

注意:Nacos 会通过心跳机制来检测服务实例的健康状态。当一个服务实例注册到 Nacos 后,该实例会定期向 Nacos Server 发送心跳包,以表明自己处于存活状态。如果 Nacos Server 在一定时间内没有收到某个服务实例的心跳(即心跳超时),就会将这个服务实例从可用实例列表中剔除,这样其他服务在进行服务发现时,就不会获取到这个已被剔除的不健康实例,从而避免调用失败。

配置外部数据库连接

1.在本地mysql中,执行nacos中的sql文件(nacos-mysql.sql)先创建nacao表

2.再将nacos中的application.properties中的msyql连接改为本地的账号、密码等

3.重启nacos(如果成功了会出现use external ...)

【注意:此时的数据库是空的,并不会将之前nacos中的数据迁移过来,所以建议在最开始就进行外部数据库连接,如果想要迁移,可以先登录旧的nacos中进行导出,然后在新的nacos中进行导入即可】

配置相关理论介绍

  1. Namespace(命名空间) : Nacos 的全局资源隔离机制 ,通俗理解为 "不同环境的独立容器",例如用不同 Namespace 隔离开发、测试、生产环境的服务和配置,确保环境间互不干扰。
    1. namespace= online、preonline、test、dev 等不同的隔离环境
  2. Group(分组) :同一命名空间内的资源归类方式,通俗理解为 "同一环境里的文件夹",例如在生产环境 Namespace 中,用不同 Group 区分订单服务、支付服务的配置,方便分类管理。
  3. Data ID :配置文件的唯一标识(里面的内容是具体的配置),通俗理解为 "文件夹里的具体配置文件",例如订单服务 Group 中的<font style="color:rgb(0, 0, 0);">order-service-dev.properties</font>,就是一个包含该服务所有配置的 Data ID。

Nacos的操作与使用

基于SpringCloudAlibaba的配置读取

1️⃣在yaml中填写相关配置
  • 该项目的主配置为config1,然后可以导入其他的配置(利用ext或者shared-dataids导入),并且这些配置都在namespace为400e0e05-e848-4d2d-a2f6-b6fba1209dd5的空间内
  • ext和shared-dataids的区别是ext可以指定分组,但shared-dataids只能使用默认的分组DEFAULT_GROUP
  • ext和shared-dataids的refresh都很重要,开启后可以支持配置信息的动态刷新(即会实时改变)
yaml 复制代码
# 服务器配置
server:
  port: 9002  # 应用启动的端口号

# Nacos配置说明:
# 配置文件的唯一标识由三部分组成:
# 命名空间(namespace) + 分组(group) + 数据ID(dataId)
spring:
  application:
    name: config1  # 应用名称,会作为默认dataId的一部分(默认格式:${name}-${profile}.${extension})
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848  # Nacos服务器地址
        # server-addr: 127.0.0.1:8860,127.0.0.1:8861,127.0.0.1:8862  # 集群地址(注释掉的备用配置)
        file-extension: yaml  # 配置文件的格式(默认是properties)
        namespace: 400e0e05-e848-4d2d-a2f6-b6fba1209dd5  # 命名空间ID(用于环境隔离)
        group: DEFAULT_GROUP  # 默认分组(用于配置隔离)

        # 方式1:通过shared-dataids加载多个配置文件(注释掉的备用配置)
        # shared-dataids: config2.yaml,config3.yaml,config4.yaml  # 要加载的多个配置文件
        # refreshable-dataids: config3.yaml  # 哪些配置支持动态刷新

        # 方式2:通过ext-config[n]加载多个配置文件(优先级更高,支持更细粒度配置)
        ext-config[0]:
          data-id: config2.yaml  # 要加载的配置文件ID
        ext-config[1]:
          data-id: config3.yaml  # 要加载的配置文件ID
          group: CONFIG3_GROUP  # 该配置所属的分组(覆盖默认group)
        ext-config[2]:
          data-id: config4.yaml  # 要加载的配置文件ID
          group: CONFIG4_GROUP  # 该配置所属的分组
          refresh: true  # 该配置支持动态刷新(配置变更后自动生效)

前面指定的config和下面的ext的关系

  1. 基础关系
    spring.application.name: config1 定义了当前应用的名称,Nacos 会默认加载以该名称为基础的配置文件 (默认格式:config1.yaml,结合 namespace 和 group)。
    而 ext-config 是额外的配置加载规则 ,用于加载当前应用需要的其他配置文件(如 config2.yaml、config3.yaml 等)。
  2. 配置优先级
    ext-config 中指定的配置优先级高于默认配置 (即 config1.yaml)。如果 ext-config 中的配置与 config1.yaml 有冲突,会以 ext-config 的配置为准。
    此外,ext-config 内部按数组下标递增优先级依次提高 (即 ext-config[2] 优先级高于 ext-config[1])。
  3. 作用场景
    config1 通常是当前应用的主配置 ,而 ext-config 用于引入公共配置(如数据库、缓存配置)或其他模块的配置 ,实现配置复用和解耦。

2️⃣代码引入 :::color4 无论是单配置还是多配置,原理都是springcloud将所有配置归纳在一起,然后可以使用@Value(key) 进行获取【记得添加@RefreshScope注解】

:::

  • 使用configurableApplicationContext.getEnvironment().getProperty("student.name");的方式,可以直接动态刷新
  • 使用@Value(指定key)+@RefreshScope也可以支持动态刷新
  • 如果是获取多个配置
复制代码
  		@Value("${config2.name:null}") 
复制代码
  		private String config2name; 
java 复制代码
package com.muse.nacos.server.nacosserver.controller;
// 导入必要的依赖包
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @description Nacos配置测试控制器
 * @author: muse
 **/
// @RefreshScope  // 开启配置自动刷新(当前注释掉了,若启用可让@Value注解的属性动态更新)
@RestController  // 标识该类为REST风格的控制器,返回数据直接作为响应内容
public class NacosServerController {

    // 注入Spring上下文环境对象,用于动态获取配置
    @Resource
    private ConfigurableApplicationContext configurableApplicationContext;

    // 从配置中获取student.name的值,默认值为null
    @Value("${student.name:null}")
    private String name;

    // 从配置中获取config2.name的值,默认值为null
    @Value("${config2.name:null}")
    private String config2name;  // 变量名应为config2Name

    // 从配置中获取config3.name的值,默认值为null
    @Value("${config3.name:null}")
    private String config3name;  // 变量名应为config3Name

    // 从配置中获取config4.name的值,默认值为null
    @Value("${config4.name:null}")
    private String config4name;  // 变量名应为config4Name

    /**
     * 测试接口:http://localhost:9002/name
     * 说明:
     * 如果只是通过@Value获得的配置信息,不会随着Nacos的修改操作而获得最新配置信息。
     * 实时获取最新配置信息有两种方式:
     * 方式1:添加@RefreshScope注解。
     * 方式2:通过getProperty的方式,获得最新的配置信息。
     *
     * @return 配置信息对比结果
     */
    @GetMapping("/name")  // 映射GET请求到/name路径
    public String getName() {
        // 方式2:通过上下文环境动态获取最新的student.name配置
        String name1 = configurableApplicationContext.getEnvironment().getProperty("student.name");
        // 返回@Value获取的值和动态获取的值的对比
        return String.format("name=%s <br> name1=%s", name, name1);
    }

    /**
     * 测试接口:http://localhost:9002/allname
     * 用于获取所有配置文件中的name属性
     */
    @GetMapping("/allname")  // 映射GET请求到/allname路径
    public String getAllName() {
        // 返回多个配置文件中的name属性值
        return String.format("config1Name=%s<br> config2Name=%s<br> config3Name=%s<br> config4Name=%s", 
                             name, config2ame, config3ame, config4ame);
    }
}

集群配置读取

原理

在测试环境中,直接配置多个集群地址让springcloud感知即可

yaml 复制代码
spring:
  application:
    name: config1  # 应用名称,会作为默认dataId的一部分(默认格式:${name}-${profile}.${extension})
  cloud:
    nacos:
      config:
         server-addr: 127.0.0.1:8860,127.0.0.1:8861,127.0.0.1:8862  # 多个集群地址

如果其中一个节点挂了,则会自动用另外的

在生产环境中,通常不直接写地址,而是通过slb(负载均衡)

  • 生产环境中,通常会在 Nacos 集群前部署 SLB(如阿里云 SLB、Nginx 等),此时客户端只需配置 SLB 的地址(如 <font style="color:rgb(0, 0, 0);">nacos-slb.com:80,DNS会将该域名转为实际上SLB的地址</font>),由 SLB 负责分发流量到后端 Nacos 节点。

详解

1. DNS(域名系统)的作用

当 Spring Cloud 应用(客户端)需要访问 Nacos 集群时,首先会通过 DNS 解析 nacos-slb.com 这个域名。

  • 作用:DNS 负责将 "易记的域名"(如 nacos-slb.com)转换为 SLB(负载均衡器)的 IP 地址 。这样客户端无需记住复杂的 SLB IP,只需通过域名即可发起访问,同时也便于后续 SLB IP 变更时,只需修改 DNS 解析记录,无需修改客户端配置。

2. SLB(负载均衡器)的作用

客户端通过 DNS 拿到 SLB 的 IP 后,会向 SLB 发起请求。

  • 作用:SLB 接收客户端请求后,会按照预设的负载均衡策略(如轮询、权重等),将流量分发到后端的多个 Nacos 节点 (比如部署在不同服务器上的 Nacos 实例)。这样既避免了单台 Nacos 节点因流量过大而故障,又能在某台 Nacos 节点宕机时,自动将流量切换到其他健康节点,保障 Nacos 集群的高可用性。

3. 整体流程示例

假设客户端要从 Nacos 拉取配置:

  1. 客户端代码中配置的是 Nacos 相关地址为 nacos-slb.com:80(通过域名访问 SLB)。
  2. 客户端发起请求时,先向 DNS 服务器查询 nacos-slb.com 对应的 IP,DNS 返回 SLB 的 IP(比如 192.168.1.100)。
  3. 客户端向 192.168.1.100:80(SLB)发起请求。
  4. SLB 将请求转发到后端健康的 Nacos 节点(比如 10.0.0.1:8848)。
  5. Nacos 节点处理请求,返回配置数据给客户端。

通过 DNS + SLB + Nacos 集群的组合,既实现了域名的便捷访问与解耦 (DNS 负责域名解析),又实现了流量的负载均衡与高可用 (SLB 负责分发和故障转移),保障了生产环境中 Nacos 服务的稳定运行。
![](https://i-blog.csdnimg.cn/img_convert/b38ef063b1b4fa9b171f5fd6e227f4f9.png)

搭建集群

在三个nacos中,cluster.conf都得改为:填充对应的要作为集群节点的端口号和ip

使用:

在springcloud中的server-addr:多个节点用 , 隔开即可

yaml 复制代码
spring:
  application:
    name: config1  # 应用名称,会作为默认dataId的一部分(默认格式:${name}-${profile}.${extension})
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8860,127.0.0.1:8861,127.0.0.1:8862  # 集群地址

Windows 系统 Nacos 单机 / 集群操作指南

Nacos 默认使用嵌入式数据库(Derby)存储数据,仅适合测试;生产 / 开发环境需配置外部数据库(以 MySQL 为例),避免数据丢失和集群数据不一致。以下在原有操作基础上,补充外部数据库连接步骤。

一、单机模式操作步骤
1. 前置准备:创建 MySQL 数据库
  1. 打开 MySQL 客户端(如 Navicat、MySQL Workbench),执行以下 SQL 创建 Nacos 专用数据库(默认库名 <font style="color:rgb(0, 0, 0);">nacos_config</font>,可自定义):
sql 复制代码
CREATE DATABASE IF NOT EXISTS nacos_config CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  1. 进入 <font style="color:rgb(0, 0, 0);">nacos_config</font> 数据库,执行 Nacos 自带的数据库脚本:
    脚本路径:<font style="color:rgb(0, 0, 0);">Nacos 安装目录/conf/nacos-mysql.sql</font>(直接复制脚本内容到 MySQL 客户端执行,会自动创建表结构和初始化数据)。
2. 配置外部数据库连接
  • 进入 Nacos 安装目录的 <font style="color:rgb(0, 0, 0);">conf</font> 文件夹:cmd
plain 复制代码
cd D:\nacos\conf
  • 用文本编辑器打开 <font style="color:rgb(0, 0, 0);">application.properties</font>,添加 MySQL 连接配置(放在鉴权配置之前或之后均可 ):properties
properties 复制代码
# 1. 启用外部数据库(禁用嵌入式 Derby)
spring.datasource.platform=mysql
# 2. 配置 MySQL 数据源数量(单 MySQL 实例填 1)
db.num=1
# 3. MySQL 数据库连接地址(替换为你的 MySQL IP、端口、库名)
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
# 4. MySQL 账号(替换为你的 MySQL 用户名)
db.user.0=root
# 5. MySQL 密码(替换为你的 MySQL 密码)
db.password.0=123456
3. 配置鉴权(Nacos 3.0+ 必需)
  • 继续在 <font style="color:rgb(0, 0, 0);">application.properties</font> 中添加鉴权密钥(至少 32 个字符):properties
properties 复制代码
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
  • 保存文件,数据库和鉴权配置完成。
4. 启动 Nacos 单机版
  • 进入 <font style="color:rgb(0, 0, 0);">bin</font> 目录:cmd
plain 复制代码
cd D:\nacos\bin
  • 启动单机模式(此时数据会存储到 MySQL,而非嵌入式数据库):cmd
plain 复制代码
startup.cmd -m standalone
  • 验证:访问 <font style="color:rgb(0, 0, 0);">http://localhost:8848/nacos</font>,登录后在「配置管理」添加配置,再到 MySQL 的 <font style="color:rgb(0, 0, 0);">nacos_config</font> 库的 <font style="color:rgb(0, 0, 0);">config_info</font> 表中,可看到新增的配置数据,说明数据库连接成功。
5. 关闭、查看状态、其他操作(同之前)
  • 关闭 :启动窗口按 <font style="color:rgb(0, 0, 0);">Ctrl + C</font> 并输入 <font style="color:rgb(0, 0, 0);">Y</font>,或另开 Cmd 执行 <font style="color:rgb(0, 0, 0);">shutdown.cmd</font>
  • 查看状态 :检查端口 <font style="color:rgb(0, 0, 0);">netstat -ano | findstr "8848"</font>,查看进程 <font style="color:rgb(0, 0, 0);">tasklist | findstr "java"</font>
  • 修改端口 / 清理缓存:同原有步骤(清理缓存不影响 MySQL 中的数据)。
二、集群模式操作步骤

集群模式下,所有节点需连接同一个 MySQL 数据库(确保数据一致性),步骤如下:

1. 前置准备
  1. 创建 MySQL 数据库 :同单机模式步骤 1(仅需创建 1 个 <font style="color:rgb(0, 0, 0);">nacos_config</font> 库,所有节点共用)。
  2. 复制 Nacos 安装包 :复制 Nacos 目录为 <font style="color:rgb(0, 0, 0);">nacos-node1</font><font style="color:rgb(0, 0, 0);">nacos-node2</font><font style="color:rgb(0, 0, 0);">nacos-node3</font>(3 个节点)。
2. 配置各节点(以 <font style="color:rgb(0, 0, 0);">nacos-node1</font> 为例,其他节点同理)
(1)配置外部数据库连接
  • 进入 <font style="color:rgb(0, 0, 0);">nacos-node1\conf</font> 目录,打开 <font style="color:rgb(0, 0, 0);">application.properties</font>,添加 MySQL 配置(所有节点的数据库配置完全一致 ):properties
properties 复制代码
# 启用外部数据库
spring.datasource.platform=mysql
# 数据源数量(单 MySQL 实例填 1)
db.num=1
# MySQL 连接地址(替换为你的 MySQL 信息)
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
# MySQL 账号
db.user.0=root
# MySQL 密码
db.password.0=123456
(2)配置鉴权
  • 继续在 <font style="color:rgb(0, 0, 0);">application.properties</font> 中添加统一鉴权密钥(所有节点的密钥必须相同 ):properties
properties 复制代码
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
(3)修改节点端口
  • <font style="color:rgb(0, 0, 0);">application.properties</font> 中设置当前节点的端口(3 个节点端口不同):properties
properties 复制代码
server.port=8848  # node1 用 8848,node2 用 8849,node3 用 8850
(4)配置集群节点列表
  • <font style="color:rgb(0, 0, 0);">nacos-node1\conf</font> 目录下,将 <font style="color:rgb(0, 0, 0);">cluster.conf.example</font> 重命名为 <font style="color:rgb(0, 0, 0);">cluster.conf</font>,并修改内容为所有节点的 IP + 端口:plaintext
plain 复制代码
127.0.0.1:8848
127.0.0.1:8849
127.0.0.1:8850
  • 注意<font style="color:rgb(0, 0, 0);">nacos-node2</font><font style="color:rgb(0, 0, 0);">nacos-node3</font><font style="color:rgb(0, 0, 0);">cluster.conf</font> 内容与 <font style="color:rgb(0, 0, 0);">node1</font> 完全一致(确保所有节点知道集群内其他节点)。
3. 启动集群
  • 分别打开 3 个 Cmd 窗口,启动每个节点:cmd
plain 复制代码
# 启动 node1
cd D:\nacos-node1\bin
startup.cmd

# 启动 node2
cd D:\nacos-node2\bin
startup.cmd

# 启动 node3
cd D:\nacos-node3\bin
startup.cmd
4. 验证集群与数据库
  1. 检查端口 :执行以下命令,确认 8848、8849、8850 端口均已占用:cmd
plain 复制代码
netstat -ano | findstr "8848 8849 8850"
  1. 验证集群状态 :访问任意节点控制台(如 <font style="color:rgb(0, 0, 0);">http://localhost:8848/nacos</font>),登录后进入「集群管理」→「节点列表」,3 个节点均显示「健康」。
  2. 验证数据库 :在控制台添加一条配置(如 DataID 为 <font style="color:rgb(0, 0, 0);">test-cluster</font>),然后到 MySQL 的 <font style="color:rgb(0, 0, 0);">nacos_config.config_info</font> 表中,可看到该配置数据;再登录其他节点控制台,也能看到这条配置,说明集群数据通过 MySQL 保持一致。
5. 关闭集群(同之前)
  • 分别在 3 个 Cmd 窗口执行关闭命令:cmd
plain 复制代码
# 关闭 node1
cd D:\nacos-node1\bin
shutdown.cmd

# 关闭 node2
cd D:\nacos-node2\bin
shutdown.cmd

# 关闭 node3
cd D:\nacos-node3\bin
shutdown.cmd
三、关键说明
  1. 数据库版本要求 :Nacos 支持 MySQL 5.7+ 或 8.0+,若使用 MySQL 8.0,需确保 <font style="color:rgb(0, 0, 0);">application.properties</font><font style="color:rgb(0, 0, 0);">db.url.0</font> 已添加 <font style="color:rgb(0, 0, 0);">serverTimezone=UTC</font>(避免时区报错)。
  2. 集群数据一致性:所有节点必须连接同一个 MySQL 数据库,否则会出现配置 / 服务数据不一致。
  3. 密码特殊字符处理 :若 MySQL 密码含特殊字符(如 <font style="color:rgb(0, 0, 0);">!@#$</font>),需在 <font style="color:rgb(0, 0, 0);">db.password.0</font> 中用双引号包裹(如 <font style="color:rgb(0, 0, 0);">db.password.0="123!@#"</font>)。
  4. 嵌入式数据库禁用 :配置 <font style="color:rgb(0, 0, 0);">spring.datasource.platform=mysql</font> 后,Nacos 会自动禁用 Derby,无需额外操作。
四、代码开发
相关推荐
只_只2 小时前
B1013 PAT乙级JAVA题解 数素数
java·开发语言
喜欢你,还有大家2 小时前
Nginx服务——安装与搭建
java·服务器·nginx
小玉起起2 小时前
IntelliJ IDEA 2025.1 Java Stream Debugger 快速使用指南
java·intellij-idea·idea
龙卷风04052 小时前
SpringAI调用第三方模型增加自定义请求参数
java·后端
java1234_小锋2 小时前
RabbitMQ如何实现消息的持久化?
java·rabbitmq·java-rabbitmq
tqs_123453 小时前
redis zset score的计算
java·算法
kaili2303 小时前
IDEA试用过期,无法登录,重置方法
java·intellij-idea
没有bug.的程序员3 小时前
Redis 内存优化与压缩:从原理到实战的完整指南
java·数据库·redis·内存优化·压缩内存