使用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 打造一个功能完善的微服务配置中心,实现配置的集中管理和动态刷新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCv高阶(十一)——物体跟踪

文章目录 前言一、OpenCV 中的物体跟踪算法1、均值漂移&#xff08;Mean Shift&#xff09;&#xff1a;2、CamShift&#xff1a;3、KCF&#xff08;Kernelized Correlation Filters&#xff09;&#xff1a;4、MIL&#xff08;Multiple Instance Learning&#xff09;&#xf…

声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE

demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义&#xff0c;主要体现在以下几个领域&#xff1a; 音乐创作与制作 创作便利…

使用若依二次开发商城系统-4:商品属性

功能3&#xff1a;商品分类 功能2&#xff1a;商品品牌 功能1&#xff1a;搭建若依运行环境前言 商品属性功能类似若依自带的字典管理&#xff0c;分两步&#xff0c;先设置属性名&#xff0c;再设置对应的属性值。 一.操作步骤 1&#xff09;数据库表product_property和pro…

操作指南:vLLM 部署开源大语言模型(LLM)

vLLM 是一个专为高效部署大语言模型&#xff08;LLM&#xff09;设计的开源推理框架&#xff0c;其核心优势在于显存优化、高吞吐量及云原生支持。 vLLM 部署开源大模型的详细步骤及优化策略&#xff1a; 一、环境准备与安装 安装 vLLM 基础安装&#xff1a;通过 pip 直接安装…

32.768kHz晶振详解:作用、特性及与其他晶振的区别

一、32.768kHz晶振的核心作用 实时时钟&#xff08;RTC&#xff09;驱动&#xff1a; 提供精确的1Hz时钟信号&#xff0c;用于计时功能&#xff08;如电子表、计算机CMOS时钟&#xff09;。 分频公式&#xff1a; 1Hz 32.768kHz / 2^15&#xff08;通过15级二分频实现&#x…

第3讲、大模型如何理解和表示单词:词嵌入向量原理详解

1. 引言 大型语言模型&#xff08;Large Language Models&#xff0c;简称LLM&#xff09;如GPT-4、Claude和LLaMA等近年来取得了突破性进展&#xff0c;能够生成流畅自然的文本、回答复杂问题、甚至编写代码。但这些模型究竟是如何理解人类语言的&#xff1f;它们如何表示和处…

【Java面试笔记:进阶】19.Java并发包提供了哪些并发工具类?

Java 并发包(java.util.concurrent)提供了一系列强大的工具类,用于简化多线程编程、提升并发性能并确保线程安全。 1. Java 并发包的核心内容 并发包概述:java.util.concurrent 包及其子包提供了丰富的并发工具类,用于简化多线程编程。主要组成部分: 高级同步结构:如 C…

Matlab数字信号处理——小波阈值法去噪分析系统

&#x1f527; 系统简介 本系统通过 MATLAB GUI 图形界面&#xff0c;集成了 小波阈值去噪算法 的各个核心模块&#xff0c;可以实现以下功能&#xff1a; 打开语音文件&#xff1a;支持常见音频格式读取&#xff1b; 模拟加噪&#xff1a;系统内置白噪声模拟功能&#xff0…

EDI 如何与 ERP,CRM,WMS等系统集成

在数字化浪潮下&#xff0c;与制造供应链相关产业正加速向智能化供应链转型。传统人工处理订单、库存和物流的方式已难以满足下单客户对响应速度和数据准确性的严苛要求。EDI技术作为企业间数据交换的核心枢纽&#xff0c;其与ERP、CRM、WMS等业务系统的深度集成&#xff0c;成…

计算机组成原理-408考点-数的表示

常见题型&#xff1a;C语言中的有符号数和无符号数的表示。 【例】有如下C语言程序段: short si-32767&#xff1b;unsigned short usisi&#xff1b;执行上述两条语句后&#xff0c;usi的值为___。short和unsigned short均使用16位二进制数表示。 【分析】考点&#xff1a;同…

企业级AI开发利器:Spring AI框架深度解析与实战

企业级AI开发利器&#xff1a;Spring AI框架深度解析与实战 一、前言&#xff1a;Java生态的AI新纪元 在人工智能技术爆发式发展的今天&#xff0c;Java开发者面临着一个新的挑战&#xff1a;如何将大语言模型&#xff08;LLMs&#xff09;和生成式AI&#xff08;GenAI&#…

【金仓数据库征文】——选择金仓,选择胜利

目录 第一部分&#xff1a;金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分&#xff1a;金仓数据库助力行业数字化转型 2.1 电信行业&#xff1a;核心系统国产化替代 2.2 医疗行业&…

用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。

一、思路概要和知识回顾 1.思路概要 ①中缀表达式计算&#xff1a; 需要处理运算符的优先级&#xff0c;可能需要用到栈结构。 ❗❗如何将中缀表达式转换为后缀表达式&#xff1f;或者直接计算&#xff1f; 通常&#xff0c;中缀转后缀&#xff08;逆波兰式&#xff09;再…

Langchain_Agent+数据库

本处使用Agent数据库&#xff0c;可以直接执行SQL语句。可以多次循环查询问题 前文通过chain去联系数据库并进行操作&#xff1b; 通过链的不断内嵌组合&#xff0c;生成SQL在执行SQL再返回。 初始化 import os from operator import itemgetterimport bs4 from langchain.ch…

Python 爬虫如何伪装 Referer?从随机生成到动态匹配

一、Referer 的作用与重要性 Referer 是 HTTP 请求头中的一个字段&#xff0c;用于标识请求的来源页面。它在网站的正常运行中扮演着重要角色&#xff0c;例如用于统计流量来源、防止恶意链接等。然而&#xff0c;对于爬虫来说&#xff0c;Referer 也可能成为被识别为爬虫的关…

Post-Processing PropertySource instance详解 和 BeanFactoryPostProcessor详解

PropertySourcesBeanFactoryPostProcessor详解 1. 核心概念 BeanFactoryPostProcessor 是 Spring 框架中用于在 BeanFactory 初始化阶段 对 Environment 中的 PropertySource 进行后处理的接口。它允许开发者在 Bean 创建之前 对属性源进行动态修改&#xff0c;例如添加、删除…

[C]基础13.深入理解指针(5)

博客主页&#xff1a;向不悔本篇专栏&#xff1a;[C]您的支持&#xff0c;是我的创作动力。 文章目录 0、总结1、sizeof和strlen的对比1.1 sizeof1.2 strlen1.3 sizeof和strlen的对比 2、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1 代码12.2.2 代码22.2.3 代码32.2.4 …

赛灵思 XCKU115-2FLVB2104I Xilinx Kintex UltraScale FPGA

XCKU115-2FLVB2104I 是 AMD Xilinx Kintex UltraScale FPGA&#xff0c;基于 20 nm 先进工艺&#xff0c;提供高达 1 451 100 个逻辑单元&#xff08;Logic Cells&#xff09;&#xff0c;77 721 600 bit 的片上 RAM 资源&#xff0c;以及 5 520 个 DSP 切片&#xff08;DSP48E…

CAPL编程_03

1_文件操作的相关函数&#xff1a; 读文本文件内容 读取文本文件操作的三部曲 1&#xff09;打开文件 —— openFileRead ( ) 2&#xff09;逐行读取 —— fileGetString ( ) 、fileGetStringSZ ( ) 3&#xff09;关闭文件 —— fileClose ( ) char content[100];…

2025年江西建筑安全员A证适合报考人群

江西建筑安全员A证适合报考人群 江西省建筑安全员A证&#xff08;建筑施工企业主要负责人安全生产考核合格证书&#xff09;主要面向建筑行业管理人员&#xff0c;适合以下人员报考&#xff1a; 1. 企业主要负责人 法人代表、总经理、分管安全副总&#xff1a;依法需持A证&a…