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": []}
]

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

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

相关文章

Linux-CentOS的yum源

1、什么是yum yum是CentOS的软件仓库管理工具。 2、yum的仓库 2.1、yum的远程仓库源 2.1.1、国内仓库 国内较知名的网络源(aliyun源&#xff0c;163源&#xff0c;sohu源&#xff0c;知名大学开源镜像等) 阿里源:https://opsx.alibaba.com/mirror 网易源:http://mirrors.1…

16.[前端开发]Day16-HTML+CSS阶段练习(网易云音乐五)

完整代码 网易云-main-left-rank&#xff08;排行榜&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name&q…

【ts + java】古玩系统开发总结

src别名的配置 开发中文件和文件的关系会比较复杂&#xff0c;我们需要给src文件夹一个别名吧 vite.config.js import { defineConfig } from vite import vue from vitejs/plugin-vue import path from path// https://vitejs.dev/config/ export default defineConfig({pl…

使用Pygame制作“俄罗斯方块”游戏

1. 前言 俄罗斯方块&#xff08;Tetris&#xff09; 是一款由方块下落、行消除等核心规则构成的经典益智游戏&#xff1a; 每次从屏幕顶部出现一个随机的方块&#xff08;由若干小方格组成&#xff09;&#xff0c;玩家可以左右移动或旋转该方块&#xff0c;让它合适地堆叠在…

小程序设计和开发:什么是竞品分析,如何进行竞品分析

一、竞品分析的定义 竞品分析是指对竞争对手的产品进行深入研究和比较&#xff0c;以了解市场动态、发现自身产品的优势和不足&#xff0c;并为产品的设计、开发和营销策略提供参考依据。在小程序设计和开发中&#xff0c;竞品分析可以帮助开发者了解同类型小程序的功能、用户体…

Vue简介

目录 Vue是什么&#xff1f;为什么要使用Vue&#xff1f;Vue的三种加载方式拓展&#xff1a;什么是渐进式框架&#xff1f; Vue是什么&#xff1f; Vue是一套用于构建用户界面的渐进式 JavaScript (主张最少)框架 &#xff0c;开发者只需关注视图层。另一方面&#xff0c;当与…

Linux多路转接poll

Linux多路转接poll 1. poll() poll() 结构包含了要监视的 event 和发生的 event &#xff0c;接口使用比 select() 更方便。且 poll 并没有最大数量限制&#xff08;但是数量过大后性能也是会下降&#xff09;。 2. poll() 的工作原理 poll() 不再需要像 select() 那样自行…

C++【深入底层,手撕vector】

vector是向量的意思&#xff0c;看了vector的底层实现之后&#xff0c;能够很明确的认识到它其实就是我们经常使用的顺序表。在我们的认知中&#xff0c;顺序表会有一个数组、数据的size以及容量的大小。vector作为一个向量容器&#xff0c;它可以存放任意类型的数据。所以在实…

基于FPGA的BT656编解码

概述 BT656全称为“ITU-R BT.656-4”或简称“BT656”,是一种用于数字视频传输的接口标准。它规定了数字视频信号的编码方式、传输格式以及接口电气特性。在物理层面上,BT656接口通常包含10根线(在某些应用中可能略有不同,但标准配置为10根)。这些线分别用于传输视频数据、…

关于系统重构实践的一些思考与总结

文章目录 一、前言二、系统重构的范式1.明确目标和背景2.兼容屏蔽对上层的影响3.设计灰度迁移方案3.1 灰度策略3.2 灰度过程设计3.2.1 case1 业务逻辑变更3.2.2 case2 底层数据变更&#xff08;数据平滑迁移&#xff09;3.2.3 case3 在途新旧流程兼容3.2.4 case4 接口变更3.2.5…

Microsoft Power BI:融合 AI 的文本分析

Microsoft Power BI 是微软推出的一款功能强大的商业智能工具&#xff0c;旨在帮助用户从各种数据源中提取、分析和可视化数据&#xff0c;以支持业务决策和洞察。以下是关于 Power BI 的深度介绍&#xff1a; 1. 核心功能与特点 Power BI 提供了全面的数据分析和可视化功能&…

【机器学习】自定义数据集 ,使用朴素贝叶斯对其进行分类

一、贝叶斯原理 贝叶斯算法是基于贝叶斯公式的&#xff0c;其公式为&#xff1a; 其中叫做先验概率&#xff0c;叫做条件概率&#xff0c;叫做观察概率&#xff0c;叫做后验概率&#xff0c;也是我们求解的结果&#xff0c;通过比较后验概率的大小&#xff0c;将后验概率最大的…

AMS仿真方法

1. 准备好verilog文件。并且准备一份.vc文件&#xff0c;将所有的verilog file的路径全部写在里面。 2. 将verilog顶层导入到virtuoso中&#xff1a; 注意.v只要引入顶层即可。不需要全部引入。实际上顶层里面只要包含端口即可&#xff0c;即便是空的也没事。 引入时会报warni…

OpenAI o3-mini全面解析:最新免费推理模型重磅发布

引言 2025年1月31日&#xff0c;OpenAI重磅发布全新推理模型o3-mini。这款模型作为OpenAI推理系列的最新突破&#xff0c;不仅在性能和性价比方面实现跨越式提升&#xff0c;更是首次全面开放免费使用。这一重大举措彰显了OpenAI在人工智能技术普及和成本优化领域的创新决心。…

文件读写操作

写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式&#xff1a;1.ios::out、ios::trunc 清除文件内容后打开2.ios:…

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …

99.24 金融难点通俗解释:MLF(中期借贷便利)vs LPR(贷款市场报价利率)

目录 0. 承前1. 什么是MLF&#xff1f;1.1 专业解释1.2 通俗解释1.3 MLF的三个关键点&#xff1a; 2. 什么是LPR&#xff1f;2.1 专业解释2.2 通俗解释2.3 LPR的三个关键点&#xff1a; 3. MLF和LPR的关系4. 传导机制4.1 第一步&#xff1a;央行调整MLF4.2 第二步&#xff1a;银…

此虚拟机的处理器所支持的功能不同于保存虚拟机状态的虚拟机的处理器所支持的功能

1.问题&#xff1a;今天记录下自己曾经遇到的一个问题&#xff0c;就是复制别人虚拟机时弹出来的一个报错&#xff1a; 如图&#xff0c;根本原因就在于虚拟机版本的问题&#xff0c;无法对应的上&#xff0c;所以必须升级虚拟机。 2.问题解决&#xff1a; 1.直接点击放弃,此时…

Linux命令入门

Linux命令入门 ls命令 ls命令的作用是列出目录下的内容&#xff0c;语法细节如下: 1s[-a -l -h] [Linux路径] -a -l -h是可选的选项 Linux路径是此命令可选的参数 当不使用选项和参数,直接使用ls命令本体,表示:以平铺形式,列出当前工作目录下的内容 ls命令的选项 -a -a选项&a…

10 Flink CDC

10 Flink CDC 1. CDC是什么2. CDC 的种类3. 传统CDC与Flink CDC对比4. Flink-CDC 案例5. Flink SQL 方式的案例 1. CDC是什么 CDC 是 Change Data Capture&#xff08;变更数据获取&#xff09;的简称。核心思想是&#xff0c;监测并捕获数据库的变动&#xff08;包括数据或数…