Spring Cloud 集成 Nacos:微服务配置管理的利器
前言
本文适合初次接触 Nacos、希望深入了解其配置和集成方式的读者,尤其是在 Spring Cloud 微服务架构中使用 Nacos 的用户。通过本文,您将掌握 Nacos 的基本安装与配置步骤,了解如何配置数据库支持,并在 Spring Cloud 项目中快速集成 Nacos,实现服务注册与配置中心功能。
Nacos下载安装步骤
Nacos 下载安装
Nacos 是 Alibaba 开源的微服务配置管理与服务发现平台,它为微服务架构提供了统一的服务注册、配置管理和动态路由等功能。本教程将使用 Nacos 2.0.1 版本并详细说明安装与配置步骤。
下载Nacos
方式一:官网下载
您可以通过 Nacos GitHub 仓库下载需要的版本压缩包 Nacos GitHub Releases,官网地址。
方式二:使用wget命令下载
可以直接使用 wget
命令从 GitHub 或第三方镜像下载,具体方法如下:
两种方式:第一种下载速度较慢
# GitHub 下载
wget https://github.com/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
# 使用推荐的快速镜像下载
wget https://download.fastgit.org/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
下载完成后,将压缩包解压至指定目录供后续配置和使用。
配置 Nacos 数据库支持
为保障配置数据的持久化,建议将 Nacos 配置数据存储至 MySQL 数据库中,避免重启导致的数据丢失问题。
在解压的路径下找到conf文件夹,里面有一个叫nacos-mysql.sql 的文件,把它下载下来。
新建 MySQL 数据库
在 MySQL 数据库中创建一个名为 nacos
的新数据库(可以根据喜好更改数据库名称,但请确保配置文件中的名称同步更改)。
CREATE DATABASE nacos CHARACTER SET utf8 COLLATE utf8_general_ci;
导入数据库脚本
在 Nacos 安装目录的 conf
文件夹中,找到 nacos-mysql.sql
文件,该文件包含了 Nacos 所需的数据表结构。将其导入 MySQL 数据库:
mysql -u root -p nacos < /path/to/nacos/conf/nacos-mysql.sql
配置数据库连接
在 conf
目录下找到 application.properties
文件,修改 Nacos 的数据库连接配置,使其指向我们创建的 MySQL 数据库。
编辑以下配置项:
vim application.properties
编辑端口号(写一个你喜欢的数字)
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=9001
解开数据库的注释
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
编辑数据库连接的地址,用于连接mysql数据库。
账号和密码为MySQL数据库密码。
!!!注意此处的mysql.xxx.xxx:3306/nacos,nacos为此前创建的数据库名。
### Connect URL of DB:
db.url.0=jdbc:mysql://mysql.xxx.xxx:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos
启动 Nacos 服务
Nacos 支持单机和集群模式,单机模式适用于测试和开发环境,而集群模式适合生产环境。我们将介绍两种启动方式:
单机模式启动
在 bin
目录下执行以下命令:
sh startup.sh -m standalone
集群模式启动
直接执行以下命令:
sh startup.sh
也可以修改配置文件,把下图中的cluster
修改为standalone
,这样使用startup.sh
直接启动单机模式了。
# 将 cluster 改为 standalone mode=standalone
访问 Nacos
执行启动命令后,打开浏览器访问 http://127.0.0.1:9001/nacos/index.html 以查看 Nacos 控制台,默认用户名和密码均为 nacos
。
默认用户和密码都是
默认的用户名和密码都是nacos
Spring Cloud 集成 Nacos
Nacos 支持 Spring Cloud 应用的服务注册、配置管理和动态路由等功能。在本节中,我们将通过 IDEA 创建一个 Spring Cloud 项目,并集成 Nacos 作为服务注册中心和配置中心。
项目初始化
在 IDEA 中创建一个新的 Spring Boot 项目并命名为 GoboyCloud
,并添加 Spring Cloud Alibaba
和 Nacos
相关依赖。以下是 GoboyCloud
父项目的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>GoboyNacos</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cloud.goboy</groupId>
<artifactId>goboycloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>goboycloud</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<java.version>8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring cloud依赖 他们的版本是需要一一对应的-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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.3.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>
父项目的 pom.xml
定义了 Spring Cloud 和 Spring Cloud Alibaba 依赖版本,各子项目都使用同一版本下的子依赖版本。
注意:spring-cloud-starter-alibaba-nacos-config
和 Spring Boot
的版本必须兼容。建议根据项目需求查看官方文档,以确保版本对应关系。
创建子模块并配置 Nacos 依赖
创建一个子模块 GoboyNacos
,用于实现微服务应用中的业务逻辑,并添加 Nacos 相关依赖。以下是 GoboyNacos
模块的 pom.xml
文件内容:
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>
<groupId>com.cloud.goboy</groupId>
<artifactId>goboycloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>GoboyNacos</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>GoboyNacos</name>
<description>Demo project for Spring Cloud Nacos</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<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>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<finalName>${project.name}</finalName>
</configuration>
</plugin>
</plugins>
</build>
</project>
继承了 GoboyCloud 的 pom.xml
。且引入依赖:
spring-cloud-starter-alibaba-nacos-config
:作为 Nacos 客户端读取 Nacos 配置。spring-boot-starter-web
:提供 Web 接口。
新建bootstrap.yml
先保证Nacos服务已经启动,bootstrap.yml
优先级高于application.yml
所以配置文件名设置为bootstrap.yml
在 GoboyNacos 项目中新增 bootstrap.yml
,添加一下内容:
spring:
application:
name: GoboyNacos
cloud:
nacos:
config:
server-addr: 8.xxx.xx.xxx:9001
file-extension: yaml #配置内容的数据格式,有properties和yaml类型(可选)
# refresh : true #开启自动刷新开启后不需要使用@RefreshScope注解
之所以需要配置 spring.application.name
的名称,是因为它是构成 Nacos服务配置 Data Id
的一部分。
Nacos 服务中Data Id
完整格式组成如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix
:默认为spring.application.name
的值。spring.profiles.active
:是当前环境对应的 profile,如果为空,则-${spring.profiles.active}
为空。file-extension
:配置内容格式,支持properties
和yaml
格式。
上述的 bootstrap.yml 配置表示Nacos Server会读取 Data Id 为 GoboyNacos
****,file-extension类型为 YAML
配置类。
启动类
创建一个新的 Java 类 NacosConfigApplication
,作为项目的启动入口:
package com.cloud.goboy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class NacosconfigApplication {
public static void main(String[] args) {
SpringApplication.run(NacosconfigApplication.class, args);
}
}
创建配置控制器
接下来,创建一个控制器 ConfigController
来处理配置请求:在这里,我们使用 @RefreshScope
注解,使得配置能够动态更新。当 Nacos 中的配置被修改后,应用会自动感知变化并更新值。
package com.cloud.goboy.controller;
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.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RefreshScope
@RestController
public class ConfigController {
private static final Logger logger = LoggerFactory.getLogger(ConfigController.class);
@Value("${user:Goboy}")
private String user;
@GetMapping(value = "/config")
public String config() {
logger.info("nacos user : {}", user);
return user;
}
}
在配置文件中配置 refresh : true # 开启自动刷新开启后不需要使用@RefreshScope注解。
配置 Nacos
在 Nacos 控制台中添加一个新的配置项:
- Data Id:
GoboyNacos
- Group:
DEFAULT_GROUP
- 配置格式:YAML-
- 配置内容:
server:
port: 9080
user: Goboy
此配置将为应用指定端口并设置默认用户名称。配置内容完成后如下图所示:
启动项目
我们从下图中可以看出,在我们本地没有配置server端口为9080的情况下。启动端口变成了9080。
简单的接口测试
动态配置管理
使用 @RefreshScope
我们通过 @Value 注解可以获取到配置中心(yml)的值,但是没有办法动态感知修改后的值,当我们Controller访问的时候,实际上访问的是Controller的Bean实例,服务启动初始化的过程中Bean在单例对象池里面的属性已经赋值了。
原始值:Goboy10086
修改Nacos配置中心:The current value is modified
@RefreshScope 原理
@RefreshScope
是 Spring Cloud 提供的一个注解,旨在实现对 Bean 的动态更新功能。通过将该注解应用于 Bean,Spring 会在配置发生变化时自动重新加载该 Bean。这一特性在微服务架构中尤为重要,因为它允许开发者在不重启应用的情况下,实时更新应用的配置信息。
工作机制
Bean 创建与初始化:
当应用启动时,带有 @RefreshScope
注解的 Bean 会被正常初始化。此时,Spring 将这些 Bean 的初始状态存储在上下文中。
配置更改的检测:
在使用 Nacos 作为配置中心时,Nacos 会在配置发生变化时触发一个事件,这个事件会被 Spring Cloud 监听。具体来说,当 Nacos 中的配置项被修改、增加或删除时,Nacos 会发布一个 ConfigChangeEvent
。
Bean 的刷新:
一旦 Spring Cloud 监听到配置变化的事件,带有 @RefreshScope
注解的 Bean 会被标记为过期。Spring 会根据新的配置重新创建这些 Bean 实例。
这种刷新机制并不会影响到应用的其他部分。只有那些被标记为 @RefreshScope
的 Bean 会在配置更新时重新加载,确保了系统的高效性。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤