使用Nacos打造微服务配置中心详解

 更新时间:2025年10月16日 14:45:50   作者:jakeswang  
本文介绍了Nacos作为服务注册和配置中心的使用方法,包括配置创建、客户端集成、动态刷新、多环境和多文件管理等实践,说明了其在微服务配置统一维护和动态更新中的优势,并给出了具体操作步骤和配置规则

一、背景介绍

Nacos 作为服务注册中心的使用方式,同时 Nacos 还可以作为服务配置中心,用于集中式维护各个业务微服务的配置资源。

作为服务配置中心的交互流程图如下。

这样设计的目的,有一个明显的好处就是:有利于对各个微服务的配置资源进行统一维护和管理,尤其是要更新某个配置参数时,能避免大量人肉运维工作。

今天通过一些案例我们一起来了解一下,如何使用 Nacos 来实现服务配置中心的管理。

二、方案实践

2.1、创建配置

Nacos 安装过程与之前介绍的一样,Nacos 服务端启动后,进入到服务端管理页面,在“配置列表”功能页面中,点击右上角的“+”按钮,进入“新建配置”页面,创建配置内容,示例如下:

为了便于演示,在上文中我们创建了一个 dataId 为nacos-config-client.properties,Group 为DEFAULT_GROUP,内容为blog.name=张三的配置信息。

在下文中,我们将会用到它。

2.2、创建客户端应用

首先,创建一个 Maven 工程,命名为nacos-config-client,并在pom.xml中引入相关的依赖内容,示例如下:

<properties>
    <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
    <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>

<dependencies>
    <!-- SpringBoot web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- Nacos 配置中心 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <!-- 引入 springBoot 版本号 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 引入 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>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

接着,创建一个服务启动类。

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

然后,创建一个 web 接口,以便测试上文创建的配置变量是否能生效。

@RestController
@RefreshScope
public class HelloController {

    @Value("${blog.name}")
    private String name;

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

最后,在application.properties配置文件中,添加 Nacos 服务配置中心地址,示例如下:

spring.application.name=nacos-config-client
server.port=9012

# 设置Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848

2.3、服务测试

nacos-config-client客户端服务启动起来,在浏览器中访问http://127.0.0.1:9012/hello,如果不出意外的话,会返回如下结果。

此时说明 SpringBoot 已成功从 Nacos 服务端获取到相关的配置变量。

下面我们在 Nacos 中将blog.name配置内容稍微修改一下,验证一下客户端的配置变量是否能动态刷新。

再次访问http://127.0.0.1:9012/hello,返回结果如下图。

说明在 Nacos 中修改配置变量后,SpringBoot 也会自动刷新这个配置信息。

之所以能实现这种效果,主要得益于@RefreshScope注解,它可以动态的从 Nacos 服务端获取最新的配置信息,并将其注入到 SpringBoot 中。

三、配置规则介绍

在上文中,我们简单的介绍了 Nacos 作为配置中心的使用方式。

例子中我们只配置了 Nacos 的配置中心地址信息,并没有配置任何其他规则就能成功的使用 Nacos 配置中心,它是如何做到的呢?

在 Nacos Spring Cloud 中有 5 个核心配置项,下面我们一起来看看它的作用。

  • spring.cloud.nacos.config.server-addr:对应 Nacos 服务端地址
  • spring.cloud.nacos.config.prefix:对应 DataId 的前缀,默认值为应用名称,即spring.application.name变量值
  • spring.cloud.nacos.config.file-extension:对应 DataId 的后缀,同时也是配置内容的文件格式,默认值为properties
  • spring.cloud.nacos.config.group:对应 Group 参数,默认值为DEFAULT_GROUP
  • spring.cloud.nacos.config.namespace:对应配置的命名空间,默认为空;常用于不同环境的配置隔离,如开发测试环境和生产环境的资源隔离等

默认情况下,Nacos Spring Cloud 加载出来的 dataId 完整格式如下:

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

因此,在不做任何配置项目的情况下,当 DataId 的前缀和 Spring Boot 应用名称一致,就可以成功加载对应的配置项。

如果我们不想通过应用服务名称来加载 DataId,可以借助spring.cloud.nacos.config.prefix相关规则来实现指定配置项的加载。

需要特别注意的是:由于 Spring Boot 加载顺序的缘故,自定义的配置项参数必须放在bootstrap.properties文件或者bootstrap.yaml文件中才能生效。

下面我们还是通过一个例子,来快速了解 Nacos Spring Cloud 相关配置规则的应用。

3.1、应用实践

下面我们以加载myConfig-dev.yaml配置项为例,具体实现如下。

首先,创建一个myConfig-dev配置项。

接着,创建一个bootstrap.properties文件,并指定相关配置项,内容如下:

spring.application.name=nacos-config-client
server.port=9012

# 指定运行环境
spring.profiles.active=dev

# 设置Nacos配置中心地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
# 对应 DataId 的前缀,如果不设置默认取【spring.application.name】
spring.cloud.nacos.config.prefix=myConfig
# 对应 DataId 的后缀,同时也是配置内容的文件格式,默认值为properties
spring.cloud.nacos.config.file-extension=yaml
# 对应 Group 参数,默认值为DEFAULT_GROUP
spring.cloud.nacos.config.group=DEFAULT_GROUP
# 对应配置的命名空间,默认为空
spring.cloud.nacos.config.namespace=

然后,创建一个 web 接口,以便验证配置变量是否能生效。

@RestController
@RefreshScope
public class HelloController {

    @Value("${user.id}")
    private String id;

    @Value("${user.name}")
    private String name;


    @RequestMapping("/test")
    public String test() {
        return "id" + id + ",name:" + name;
    }
}

最后,再次启动服务,在浏览器中访问http://127.0.0.1:9012/hello,如果不出意外的话,会返回如下内容。

说明,Spring Boot 已成功加载了指定配置项。

四、高级特性介绍

4.1、多环境配置介绍

在 Nacos 服务端,其实还隐含有三个核心的参数,分别是:Data IDGroupNamespace,我们可以利用它来实现更高级的功能。

这三个参数的层级关系,可以用如下图来概括。

每个参数的作用如下:

  • Namespace:表示命名空间,通常用于不同环境的配置隔离,如开发测试环境和生产环境的资源隔离等
  • Group:表示分组管理
  • Data ID:也就是我们常说的配置项,也可以简单理解为我们所说的配置文件

实际上,我们可以利用这些层级概念的关系,根据自己的需要来实现多环境的管理。

下面我们一起来看看,几种常见的环境隔离配置实现。

4.1.1、profiles 隔离实现

在上文中我们也提到了 dataId 完整格式生成规则。

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

因此,我们可以借助spring.profiles.active来实现配置资源的隔离。

同时,profiles 隔离实现也在一种最常见的做法。

4.1.2、Group 隔离实现

Group 隔离实现就比较简单了,在 Nacos 服务管理平台新建配置的时候,填写所属分组。

最后,在客户端应用下填写对应的 Group 参数即可。

# 对应 Group 参数
spring.cloud.nacos.config.group=DEFAULT_GROUP

4.1.3、Namespace 隔离实现

Namespace 隔离实现主要通过命名空间来完成,在 Nacos 服务管理平台的命令空间下创建。

创建完成之后,在配置列表的最上方可以看到除了 public 之外,多了一个刚才创建的 Namepsace。

点击test就可以切换到对应的命名空间,然后新建相关的配置项。

最后,在客户端应用下填写对应的 Namespace 参数即可。

# 对应配置的命名空间
spring.cloud.nacos.config.namespace=0c85c5cf-4421-4839-9998-ace7d8ecf5a8

需要注意的是,这里填写不是命名空间的名称,而是命名空间ID。

4.2、多文件加载介绍

在上文中我们介绍的都是单个配置文件的加载,而在实际的业务开发中,我们常常会碰到多个配置文件一起加载的场景,例如加载 Redis、RabbitMQ 等配置资源。

下面我们一起来看看相关的实现方式。

4.2.1、多个配置加载介绍

对于多个配置的加载,我们只需要做以下两步,就可以实现这个需求。

第一步:在 Nacos 中创建Data ID=redis.propertiesData ID=rabbitmq.properties的配置内容。

第二步:在 Spring Cloud 应用bootstrap.properties文件中,通过spring.cloud.nacos.config.extension-configs参数配置需要加载的文件,具体如下。

# 设置多文件加载,并支持动态刷新
spring.cloud.nacos.config.extension-configs[0].data-id=redis.properties
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true

当服务启动的时候,Nacos 客户端会自动从服务端获取相关的配置资源加载到 Spring Boot 应用中。

4.2.2、共享配置加载介绍

通过上面加载多个配置文件的例子,我们已经可以实现不同的应用共享配置的需求了。

对于共享配置使用,Nacos 还提供了另一种更便捷的配置方式,比如下面的配置与上面使用的多文件加载配置,作用是等价的。

# 设置多个共享配置文件加载,并支持动态刷新
spring.cloud.nacos.config.shared-configs[0].data-id=redis.properties
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].refresh=true
spring.cloud.nacos.config.shared-configs[1].data-id=rabbitmq.properties
spring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[1].refresh=true

4.2.3、配置加载的优先级介绍

当我们加载多个配置的时候,如果存在相同的 key,配置加载的优先级是怎样的呢?

Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置,分别如下:

  • A:通过spring.cloud.nacos.config.shared-dataids定义的共享配置
  • B:通过spring.cloud.nacos.config.ext-config[n].data-id定义的扩展配置
  • C:通过内部相关规则(应用名、应用名+ Profile)生成的配置

当三种方式同时存在的时候,他们的优先级关系为A < B < C,也就是说优先级高的会覆盖优先级底的配置。

最后总结一下:

Nacos 是 Spring Cloud Alibaba 体系中最重要的组件之一,既可以用于服务注册中心,也可以用于服务配置中心。

在微服务技术体系中,应用非常广泛,因此掌握 Nacos 相关技术的使用,对我们项目的开发会有显著的帮助。

五、实战

1. 安装与启动 Nacos

下载 Nacos

从 Nacos 的 GitHub 仓库(https://github.com/alibaba/nacos/releases)下载适合你系统的版本,解压下载好的压缩包。

启动 Nacos

  • Windows 系统:打开命令提示符,进入 Nacos 的 bin 目录,执行以下命令启动 Nacos:
startup.cmd -m standalone
  • Linux/Mac 系统:打开终端,进入 Nacos 的 bin 目录,执行以下命令启动 Nacos:

这里的 -m standalone 表示以单机模式启动。启动成功后,在浏览器中访问 http://localhost:8848/nacos,使用默认用户名 nacos 和密码 nacos 登录 Nacos 控制台。

2. 创建配置

登录 Nacos 控制台

打开浏览器,访问 http://localhost:8848/nacos,输入用户名 nacos 和密码 nacos 登录。

创建配置文件

在控制台左侧导航栏中选择 “配置管理” -> “配置列表”,点击 “+” 号创建新的配置。填写以下信息 

  • Data ID:配置文件的唯一标识,通常采用 应用名.properties应用名.yml 的格式,例如 example-service.properties
  • Group:配置分组,默认为 DEFAULT_GROUP
  • 配置格式:根据实际情况选择 propertiesyaml
  • 配置内容:输入具体的配置信息,例如在 example-service.properties 中可以添加如下内容: 

properties

server.port=8081
spring.datasource.url=jdbc:mysql://localhost:3306/example_db
spring.datasource.username=root
spring.datasource.password=123456

3. 在微服务中集成 Nacos 配置中心

添加依赖

以 Spring Boot 项目为例,在 pom.xml 中添加 Nacos 配置中心的依赖:

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

配置 Nacos 客户端

src/main/resources 目录下创建 bootstrap.propertiesbootstrap.yml 文件,添加以下配置:

spring.application.name=example-service
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties

这里的 spring.application.name 要与在 Nacos 控制台创建的配置文件的 Data ID 中的应用名一致,spring.cloud.nacos.config.server-addr 是 Nacos 服务器的地址,spring.cloud.nacos.config.file-extension 是配置文件的格式。

获取配置信息

在 Spring Boot 项目中,可以使用 @Value 注解或 @ConfigurationProperties 注解来获取配置信息。

以下是使用 @Value 注解的示例:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConfigController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/config")
    public String getConfig() {
        return "Server port: " + serverPort;
    }
}

4. 动态刷新配置

开启动态刷新

在需要动态刷新配置的类上添加 @RefreshScope 注解,例如:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class ConfigController {

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/config")
    public String getConfig() {
        return "Server port: " + serverPort;
    }
}

测试动态刷新

当在 Nacos 控制台修改配置信息并发布后,无需重启微服务,调用 /config 接口即可获取到最新的配置信息。

5. 多环境配置管理

创建不同环境的配置文件

在 Nacos 控制台分别创建不同环境(如开发、测试、生产)的配置文件,

例如 example-service-dev.propertiesexample-service-test.propertiesexample-service-prod.properties

根据环境加载配置

bootstrap.properties 中添加 spring.profiles.active 属性来指定当前环境,例如:

spring.application.name=example-service
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.file-extension=properties
spring.profiles.active=dev

这样,微服务将加载 example-service-dev.properties 中的配置信息。

通过以上步骤,你就可以使用 Nacos 打造一个功能完善的微服务配置中心,实现配置的集中管理和动态刷新。

六、总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java连接HBase,连接不上报错can not resolve问题及解决

    java连接HBase,连接不上报错can not resolve问题及解决

    这篇文章主要介绍了java连接HBase,连接不上报错can not resolve问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现订单超时自动取消的7种方案

    Java实现订单超时自动取消的7种方案

    在电商、外卖、票务等系统中,订单超时未支付自动取消是一个常见的需求,这个功能乍一看很简单,甚至很多初学者会觉得:"不就是加个定时器么?" 但真到了实际工作中,细节的复杂程度往往会超乎预期,本文给大家介绍了Java实现订单超时自动取消的7种方案
    2024-12-12
  • java基础的详细了解第九天

    java基础的详细了解第九天

    这篇文章对Java编程语言的基础知识作了一个较为全面的汇总,在这里给大家分享一下。需要的朋友可以参考,希望能给你带来帮助
    2021-08-08
  • Java使用quartz实现定时任务示例详解

    Java使用quartz实现定时任务示例详解

    这篇文章主要为大家介绍了Java使用quartz实现定时任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • SpringBoot定制JSON响应数据返回的示例代码

    SpringBoot定制JSON响应数据返回的示例代码

    @JsonView 是 Jackson 库中的一个注解,它允许你定义哪些属性应该被序列化到 JSON 中,基于不同的“视图”或“配置”,在本文中,通过了解@JsonView,你将能够更好地掌握如何在Spring Boot应用中定制JSON数据的输出,需要的朋友可以参考下
    2024-05-05
  • Spring的IOC容器实例化bean的方式总结

    Spring的IOC容器实例化bean的方式总结

    IOC容器实例化bean的三种方式:构造方法、静态工厂、实例工厂,本文将通过代码示例给大家详细讲解一下这三种方式,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • Java实现修改PDF文件MD5值且保持内容不变

    Java实现修改PDF文件MD5值且保持内容不变

    在某些场景中,我们可能需要改变PDF文件的MD5值,而又不希望改变文件的可视内容,本文详细介绍了如何实现这一目标,并提供了具体的Java实现示例,需要的可以参考下
    2023-10-10
  • MyBatis动态SQL标签的用法详解

    MyBatis动态SQL标签的用法详解

    这篇文章主要介绍了MyBatis动态SQL标签的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • RabbitMQ的安装和配置可视化界面的详细步骤

    RabbitMQ的安装和配置可视化界面的详细步骤

    这篇文章主要介绍了RabbitMQ的安装和配置可视化界面的详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • SpringShell命令行之交互式Shell应用开发方式

    SpringShell命令行之交互式Shell应用开发方式

    本文将深入探讨Spring Shell的核心特性、实现方式及应用场景,帮助开发者掌握这一强大工具,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论