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 AlibabaNacos 相关依赖。以下是 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-configSpring 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:配置内容格式,支持 propertiesyaml 格式。

上述的 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 IdGoboyNacos
  • GroupDEFAULT_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 会在配置更新时重新加载,确保了系统的高效性。

posted @   张不惑  阅读(445)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示