配置中心
概述
配置中心是微服务中不可或缺的组件,因为如果没有配置中心,那么各个微服务的的配置信息无法得到统一和管理,会变得冗余。
:::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中进行导入即可】

配置相关理论介绍
- Namespace(命名空间) : Nacos 的全局资源隔离机制 ,通俗理解为 "不同环境的独立容器",例如用不同 Namespace 隔离开发、测试、生产环境的服务和配置,确保环境间互不干扰。
- namespace= online、preonline、test、dev 等不同的隔离环境
- Group(分组) :同一命名空间内的资源归类方式,通俗理解为 "同一环境里的文件夹",例如在生产环境 Namespace 中,用不同 Group 区分订单服务、支付服务的配置,方便分类管理。
- 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的关系
- 基础关系
spring.application.name: config1 定义了当前应用的名称,Nacos 会默认加载以该名称为基础的配置文件 (默认格式:config1.yaml,结合 namespace 和 group)。
而 ext-config 是额外的配置加载规则 ,用于加载当前应用需要的其他配置文件(如 config2.yaml、config3.yaml 等)。 - 配置优先级
ext-config 中指定的配置优先级高于默认配置 (即 config1.yaml)。如果 ext-config 中的配置与 config1.yaml 有冲突,会以 ext-config 的配置为准。
此外,ext-config 内部按数组下标递增优先级依次提高 (即 ext-config[2] 优先级高于 ext-config[1])。 - 作用场景
config1 通常是当前应用的主配置 ,而 ext-config 用于引入公共配置(如数据库、缓存配置)或其他模块的配置 ,实现配置复用和解耦。
2️⃣代码引入 :::color4 无论是单配置还是多配置,原理都是springcloud将所有配置归纳在一起,然后可以使用@Value(key) 进行获取【记得添加@RefreshScope注解】
:::
- 使用configurableApplicationContext.getEnvironment().getProperty("student.name");的方式,可以直接动态刷新
- 使用@Value(指定key)+@RefreshScope也可以支持动态刷新
- 如果是获取多个配置
- // 从配置中获取config2.name(这个是key)的值,默认值为null
@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 拉取配置:
- 客户端代码中配置的是 Nacos 相关地址为 nacos-slb.com:80(通过域名访问 SLB)。
- 客户端发起请求时,先向 DNS 服务器查询 nacos-slb.com 对应的 IP,DNS 返回 SLB 的 IP(比如 192.168.1.100)。
- 客户端向 192.168.1.100:80(SLB)发起请求。
- SLB 将请求转发到后端健康的 Nacos 节点(比如 10.0.0.1:8848)。
- Nacos 节点处理请求,返回配置数据给客户端。
通过 DNS + SLB + Nacos 集群的组合,既实现了域名的便捷访问与解耦 (DNS 负责域名解析),又实现了流量的负载均衡与高可用 (SLB 负责分发和故障转移),保障了生产环境中 Nacos 服务的稳定运行。

搭建集群

在三个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 数据库
- 打开 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;
- 进入
<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. 前置准备
- 创建 MySQL 数据库 :同单机模式步骤 1(仅需创建 1 个
<font style="color:rgb(0, 0, 0);">nacos_config</font>
库,所有节点共用)。 - 复制 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. 验证集群与数据库
- 检查端口 :执行以下命令,确认 8848、8849、8850 端口均已占用:cmd
plain
netstat -ano | findstr "8848 8849 8850"
- 验证集群状态 :访问任意节点控制台(如
<font style="color:rgb(0, 0, 0);">http://localhost:8848/nacos</font>
),登录后进入「集群管理」→「节点列表」,3 个节点均显示「健康」。 - 验证数据库 :在控制台添加一条配置(如 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
三、关键说明
- 数据库版本要求 :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>
(避免时区报错)。 - 集群数据一致性:所有节点必须连接同一个 MySQL 数据库,否则会出现配置 / 服务数据不一致。
- 密码特殊字符处理 :若 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>
)。 - 嵌入式数据库禁用 :配置
<font style="color:rgb(0, 0, 0);">spring.datasource.platform=mysql</font>
后,Nacos 会自动禁用 Derby,无需额外操作。