nacos 配置管理、 配置热更新、 动态路由
文章目录
- 配置管理
- 引入jar包
- 添加 bootstrap.yaml 文件配置
- 在application.yaml 中添加自定义信息
- nacos 配置信息
- 配置热更新
- 采用第一种配置
- 根据服务名确定配置文件
- 根据后缀确定配置文件
- 动态路由
- DynamicRouteLoader
- NacosConfigManager
- RouteDefinitionWriter
- 路由配置
配置管理
统一配置管理可以解决多服务配置过的问题,同时该服务配置文件移交配置中心 处理信息

引入jar包
配置 pom.xml 添加 config 和 bootstrap 的 jar 包
<!--nacos配置管理-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--读取bootstrap文件-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
添加 bootstrap.yaml 文件配置
配置说明
spring.application.name: 指定微服务的名称(cart-service),Nacos 会根据该名称加载对应的配置。
spring.profiles.active: 指定当前激活的环境(dev),Nacos 会加载 cart-service-dev.yaml 配置。
spring.cloud.nacos.server-addr: 指定 Nacos 服务器的地址(127.0.0.1:8848)。
spring.cloud.nacos.config.file-extension: 指定配置文件的格式为 yaml。
spring.cloud.nacos.config.shared-configs: 定义共享配置,多个微服务可以共用这些配置。

spring:application:name: cart-service # 服务名称profiles:active: devcloud:nacos:server-addr: 127.0.0.1:8848# nacos地址config:file-extension: yaml # 文件后缀名shared-configs: # 共享配置- dataId: shared-jdbc.yaml # 共享mybatis配置- dataId: shared-log.yaml # 共享日志配置- dataId: shared-swagger.yaml # 共享日志配置
在application.yaml 中添加自定义信息
hm:db:batabase: hm-carthost: 127.0.0.1port: 3306username: rootpassword: password
nacos 配置信息

shared-log.yaml
logging:level:com.hmall: debugpattern:dateformat: HH:mm:ss:SSSfile:path: "logs/${spring.application.name}"
shared-jdbc.yaml
spring:datasource:url: jdbc:mysql://${hm.db.host:127.0.0.1}:${hm.db.port:3306}/${hm.db.batabase}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: ${hm.db.username}password: ${hm.db.password}
mybatis-plus:configuration:default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandlerglobal-config:db-config:update-strategy: not_nullid-type: auto
shared-swagger.yaml
knife4j:enable: trueopenapi:title: ${hm.swagger.title:接口文档}description: ${hm.swagger.desc:接口文档信息}email: testconcat: testurl: testversion: v1.0.0group:default:group-name: defaultapi-rule: packageapi-rule-resources:- ${hm.swagger.package}
配置热更新
当修改配置文件时,微服务无需重启即可生效
项目启动时 会去加载 相关配置 文件
Nacos 支持配置的动态更新。当配置文件在 Nacos 中修改后,应用会实时获取最新配置,无需重启。

采用第一种配置
@Data
@Component
@ConfigurationProperties(prefix = "hm.cart")
public class CartProperties {private Integer maxItems;}
nacos 配置 相关信息

根据服务名确定配置文件
在 Spring Cloud 应用中,Nacos 可以根据 spring.application.name 指定的服务名来加载对应的配置文件。例如:
服务名:user-service
Nacos 中的配置文件:user-service.properties 或 user-service.yaml
应用启动时,Nacos 会自动加载与服务名匹配的配置文件。
根据后缀确定配置文件
Nacos 还支持通过后缀来区分不同的配置文件。例如:
服务名:user-service
环境:dev
Nacos 中的配置文件:user-service-dev.properties 或 user-service-dev.yaml
在 Spring Cloud 中,可以通过 spring.profiles.active 指定环境后缀,Nacos 会加载对应环境的配置文件。
动态路由
要实现动态路由首先要将路由配置保存到Nacos,当Nacos中的路由配置变更时,推送最新配置到网关,实时更新网关中的路由信息。
我们需要完成两件事情:
- 监听Nacos配置变更的消息
- 当配置变更时,将最新的路由信息更新到网关路由表
DynamicRouteLoader
DynamicRouteLoader 是一个 Spring Cloud Gateway 的组件,用于从 Nacos 动态加载和更新路由配置。它通过监听 Nacos 配置中心的变化,实时更新网关的路由信息。
- DynamicRouteLoader 类:
- 负责从 Nacos 动态加载路由配置,并在配置发生变化时更新网关的路由表。
- 使用 NacosConfigManager 从 Nacos 获取配置数据,并监听配置变化。
- 依赖注入:
- NacosConfigManager:用于与 Nacos 配置中心交互,获取配置数据。
- RouteDefinitionWriter:用于更新 Spring Cloud Gateway 的路由定义。
- routeIds:用于存储当前已加载的路由 ID,方便后续更新时删除旧路由。
- 初始化方法 initRouteConfig:
- 在项目启动时调用(通过 @PostConstruct 注解)。
- 从 Nacos 获取初始的路由配置(dataId 为 gateway-routes.json,group 为 DEFAULT_GROUP)。
- 添加一个监听器,当 Nacos 中的配置发生变化时,自动调用 updateConfigInfo 方法更新路由。
- 配置更新方法 updateConfigInfo:
- 解析从 Nacos 获取的配置信息(JSON 格式),并将其转换为 RouteDefinition 对象列表。
- 删除旧的路由配置(通过 routeIds 中存储的路由 ID)。
- 清空 routeIds,然后遍历新的路由配置,将其保存到 RouteDefinitionWriter 中,并更新 routeIds。
package com.hmall.gateway.routers;import cn.hutool.json.JSONUtil;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicRouteLoader {private final NacosConfigManager nacosConfigManager;private final RouteDefinitionWriter writer;private final String dataId = "gateway-routes.json";private final String group = "DEFAULT_GROUP";private final Set<String> routeIds = new HashSet<>();@PostConstructpublic void initRouteConfig() throws NacosException {// 项目启动时, 拉取配置信息, 并添加监听器String configInfo = nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, 5000, new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String configInfo) {updateConfigInfo(configInfo);}});// 读取到配置,更新路由表updateConfigInfo(configInfo);}public void updateConfigInfo(String configInfo){log.debug("监听获取路由配置信息:{}", configInfo );// 解析配置信息, 转为RouteDefinitionList<RouteDefinition> routeDefinitions = JSONUtil.toList(configInfo, RouteDefinition.class);// 删除旧的路由表信息routeIds.forEach(e->{writer.delete(Mono.just(e)).subscribe();});// 清空id 表routeIds.clear();// 遍历路由信息for (RouteDefinition routeDefinition: routeDefinitions) {// 更新路由表writer.save(Mono.just(routeDefinition)).subscribe();routeIds.add(routeDefinition.getId());}}
}
NacosConfigManager
NacosConfigManager 是 Spring Cloud Alibaba Nacos 提供的一个核心类,用于管理与 Nacos 配置中心的交互。它封装了 Nacos 配置客户端的操作,简化了从 Nacos 获取配置、监听配置变化等功能的实现。
NacosConfigManager 的作用
- 配置管理:
- 提供从 Nacos 配置中心获取配置的能力。
- 支持动态监听配置变化,实时更新本地配置。
- 简化操作:
- 封装了 Nacos 客户端的底层操作,开发者无需直接操作 Nacos 的原生 API。
- 与 Spring Cloud 集成:
- 作为 Spring Cloud Alibaba 的一部分,与 Spring Cloud 的配置管理机制无缝集成。
NacosConfigManager 的核心方法
获取配置
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
- 作用:从 Nacos 配置中心获取指定 dataId 和 group 的配置内容。
- 参数:
- dataId:配置的唯一标识符(如 gateway-routes.json)。
- group:配置的分组(如 DEFAULT_GROUP)。
- timeoutMs:获取配置的超时时间(毫秒)。
- 返回值:配置内容的字符串形式。
添加监听器
void addListener(String dataId, String group, Listener listener) throws NacosException;
- 作用:为指定 dataId 和 group 的配置添加监听器,当配置发生变化时触发回调。
- 参数:
- dataId:配置的唯一标识符。
- group:配置的分组。
- listener:监听器接口,实现 receiveConfigInfo 方法以处理配置变化。
获取 ConfigService
ConfigService getConfigService();
- 作用:获取底层的 ConfigService 对象,用于直接操作 Nacos 配置客户端。
- 返回值:ConfigService 实例。
RouteDefinitionWriter
RouteDefinitionWriter 是 Spring Cloud Gateway 提供的一个核心接口,用于动态管理路由定义(RouteDefinition)。它允许在运行时添加、删除或更新路由,从而实现动态路由的功能。
RouteDefinitionWriter 的作用
- 动态路由管理:
- 提供添加、删除和更新路由的能力。
- 支持在运行时修改路由配置,无需重启网关服务。
- 与 Spring Cloud Gateway 集成:
- 作为 Spring Cloud Gateway 的一部分,与网关的路由机制无缝集成。
- 响应式编程支持:
- 基于 Reactor 的响应式编程模型,所有操作返回
Mono<Void>。
RouteDefinitionWriter 的核心方法
保存路由
Mono<Void> save(Mono<outeDefinition> route);
- 作用:保存一个路由定义。
- 参数:
- route:RouteDefinition 对象,表示一个路由规则。
- 返回值:
Mono<Void>,表示操作完成后的信号。
删除路由
Mono<Void> delete(Mono<String> routeId);
- 作用:根据路由 ID 删除一个路由定义。
- 参数:
- routeId:路由的唯一标识符。
- 返回值:
Mono<Void>,表示操作完成后的信号。
路由配置
在 nacos 中添加 gateway-routes.json 配置文件 信息 实现动态路由
id: 路由的唯一标识符,值为 item。
uri: 路由的目标服务地址,lb://item-service 表示通过负载均衡访问 item-service。
predicates: 路由的匹配条件。
name: 使用 Path 断言,表示根据请求路径匹配。
args: 路径匹配规则。
_genkey_0: /items/,匹配以 /items/ 开头的请求。
_genkey_1: /search/,匹配以 /search/ 开头的请求。
filters: 路由过滤器列表,当前为空。
[{"id": "item","uri": "lb://item-service","predicates": [{"name": "Path","args": {"_genkey_0": "/items/**","_genkey_1": "/search/**"}}],"filters": []},{"id": "user","uri": "lb://user-service","predicates": [{"name": "Path","args": {"_genkey_0": "/users/**","_genkey_1": "/addresses/**"}}],"filters": []},{"id": "cart","uri": "lb://cart-service","predicates": [{"name": "Path","args": {"_genkey_0": "/carts/**"}}],"filters": []}
]
相关文章:
nacos 配置管理、 配置热更新、 动态路由
文章目录 配置管理引入jar包添加 bootstrap.yaml 文件配置在application.yaml 中添加自定义信息nacos 配置信息 配置热更新采用第一种配置根据服务名确定配置文件根据后缀确定配置文件 动态路由DynamicRouteLoaderNacosConfigManagerRouteDefinitionWriter 路由配置 配置管理 …...
程序代码篇---Numpyassert迭代器
文章目录 前言第一部分:Numpy1. 创建数组2. 数组索引和切片3. 数组形状操作4. 数组运算5. 数学函数6. 随机数生成7. 数组排序 第二部分:assert基本语法1.condition2.error_message 示例注意事项断言的用途 第三部分:迭代器迭代器协议1.__iter…...
(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识
学员闯关手册:https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld 课程视频:https://www.bilibili.com/video/BV13U1VYmEUr/ 课程文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python 关卡作业:htt…...
分布式微服务系统架构第90集:现代化金融核心系统
#1.1 深化数字化转型,核心面临新挑战 1、架构侧:无法敏捷协同数字金融经营模式转型。 2、需求侧:业务需求传导低效始终困扰金融机构。 3、开发侧:创新产品上市速度低于期望。 4、运维侧:传统面向资源型监控体系难以支撑…...
浅谈Linux 权限、压缩、进程与服务
概述 放假回家,对Linux系统的一些知识进行重新的整理,做到温故而知新,对用户权限管理、文件赋权、压缩文件、进程与服务的知识进行了一次梳理和总结。 权限管理 Linux最基础的权限是用户和文件,先了解基础的用户权限和文件权限…...
SpringBoot中Excel表的导入、导出功能的实现
文章目录 一、easyExcel简介二、Excel表的导出2.1 添加 Maven 依赖2.2 创建导出数据的实体类4. 编写导出接口5. 前端代码6. 实现效果 三、excel表的导出1. Excel表导入的整体流程1.1 配置文件存储路径 2. 前端实现2.1 文件上传组件 2.2 文件上传逻辑3. 后端实现3.1 文件上传接口…...
JavaScript前后端交互-AJAX/fetch
摘自千峰教育kerwin的js教程 AJAX 1、AJAX 的优势 不需要插件的支持,原生 js 就可以使用用户体验好(不需要刷新页面就可以更新数据)减轻服务端和带宽的负担缺点: 搜索引擎的支持度不够,因为数据都不在页面上…...
动态规划DP 背包问题 完全背包问题(题目分析+C++完整代码)
概览检索 动态规划DP 概览(点击链接跳转) 动态规划DP 背包问题 概览(点击链接跳转) 完全背包问题 原题链接 AcWiing 3. 完全背包问题 题目描述 有 N种物品和一个容量是 V的背包,每种物品都有无限件可用。 第 i种物…...
【cocos creator】【模拟经营】餐厅经营demo
下载:【cocos creator】模拟经营餐厅经营...
JavaScript系列(52)--编译优化技术详解
JavaScript编译优化技术详解 🚀 今天,让我们深入探讨JavaScript的编译优化技术。通过理解和应用这些技术,我们可以显著提升JavaScript代码的执行效率。 编译优化基础概念 🌟 💡 小知识:JavaScript引擎通常…...
【深度学习】softmax回归的从零开始实现
softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样,)我们认为softmax回归也是重要的基础,因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集,并设置数据迭代器的批量大小为256。 import torch from IP…...
【Redis】set 和 zset 类型的介绍和常用命令
1. set 1.1 介绍 set 类型和 list 不同的是,存储的元素是无序的,并且元素不允许重复,Redis 除了支持集合内的增删查改操作,还支持多个集合取交集,并集,差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …...
程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 今天我们来对上一节做一些小补充,了解学习一下assert断言,指针的使用和传址调用…...
代码随想录-训练营-day16
530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode…...
Vue 3 中的父子组件传值:详细示例与解析
在 Vue 3 中,父子组件之间的数据传递是一个常见的需求。父组件可以通过 props 将数据传递给子组件,而子组件可以通过 defineProps 接收这些数据。本文将详细介绍父子组件传值的使用方法,并通过优化后的代码示例演示如何实现。 1. 父子组件传值…...
谈谈你所了解的AR技术吧!
深入探讨 AR 技术的原理与应用 在科技飞速发展的今天,AR(增强现实)技术已经悄然改变了我们与周围世界互动的方式。你是否曾想象过如何能够通过手机屏幕与虚拟物体进行实时互动?在这篇文章中,我们将深入探讨AR技术的原…...
神经网络的数据流动过程(张量的转换和输出)
文章目录 1、文本从输入到输出,经历了什么?2、数据流动过程是张量,如何知道张量表达的文本内容?3、词转为张量、张量转为词是唯一的吗?为什么?4、如何保证词张量的质量和合理性5、总结 🍃作者介…...
爬取鲜花网站数据
待爬取网页: 代码: import requestsfrom lxml import etree import pandas as pdfrom lxml import html import xlwturl "https://www.haohua.com/xianhua/"header {"accept":"image/avif,image/webp,image/apng,image/sv…...
vue框架技术相关概述以及前端框架整合
vue框架技术概述及前端框架整合 1 node.js 介绍:什么是node.js Node.js就是运行在服务端的JavaScript。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎。 作用 1 运行java需要安装JDK,而Node.js是JavaScript的运行环…...
深入解析 C++ 字符串处理:提取和分割的多种方法
在 C 编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时。本文将详细探讨如何使用 C 标准库中的工具(如 std::istringstream 和 std::string 的成员函数)来提取和分割字符串,并分析不同方法的适…...
数据结构 树2
文章目录 前言 一,二叉搜索树的高度 二,广度优先VS深度优先 三,广度优先的代码实现 四,深度优先代码实现 五,判断是否为二叉搜索树 六,删除一个节点 七,二叉收索树的中序后续节点 总结 …...
NeetCode刷题第19天(2025.1.31)
文章目录 099 Maximum Product Subarray 最大乘积子数组100 Word Break 断字101 Longest Increasing Subsequence 最长递增的子序列102 Maximum Product Subarray 最大乘积子数组103 Partition Equal Subset Sum 分区等于子集和104 Unique Paths 唯一路径105 Longest Common Su…...
Google Chrome-便携增强版[解压即用]
Google Chrome-便携增强版 链接:https://pan.xunlei.com/s/VOI0OyrhUx3biEbFgJyLl-Z8A1?pwdf5qa# a 特点描述 √ 无升级、便携式、绿色免安装,即可以覆盖更新又能解压使用! √ 此增强版,支持右键解压使用 √ 加入Chrome增强…...
[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型
Paper Card 论文标题:RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者:Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接:https://arxiv.org/ab…...
什么是Rust?它有什么特点?为什么要学习Rust?
什么是Rust?它有什么特点?为什么要学习Rust? 如果你是一名编程初学者,或者已经有一些编程经验但对Rust感兴趣,那么这篇文章就是为你准备的!我们将用简单易懂的语言,带你了解Rust是什么、它有什…...
[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型
Paper Card 论文标题:Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者:Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…...
AIP-134 标准方法:Update
编号134原文链接AIP-134: Standard methods: Update状态批准创建日期2019-01-24更新日期2022-06-02 REST API通常向资源URI(如 /v1/publishers/{publisher}/books/{book} )发出 PATCH 或 PUT 请求,更新资源。 面向资源设计(AIP-…...
计算机网络一点事(24)
TCP可靠传输,流量控制 可靠传输:每字节对应一个序号 累计确认:收到ack则正确接收 返回ack推迟确认(不超过0.5s) 两种ack:专门确认(只有首部无数据) 捎带确认(带数据…...
DIFY源码解析
偶然发现Github上某位大佬开源的DIFY源码注释和解析,目前还处于陆续不断更新地更新过程中,为大佬的专业和开源贡献精神点赞。先收藏链接,后续慢慢学习。 相关链接如下: DIFY源码解析...
Kafka SSL(TLS)安全协议
文章目录 Kafka SSL(TLS)安全协议1. Kafka SSL 的作用1.1 数据加密1.2 身份认证1.3 数据完整性1.4 防止中间人攻击1.5 确保安全的分布式环境1.6 防止拒绝服务(DoS)攻击 2. Kafka SSL 配置步骤(1)创建 SSL 证…...
