Spring Cloud Gateway 动态路由实现方案

动态路由的核心需求:在不重启网关的情况下,实时修改路由规则。以下是 4 种实现方案:

方案 1:基于内存的动态路由(RefreshRoutesEvent)

适用场景:临时修改,重启失效

@Autowired
private RouteDefinitionWriter routeDefinitionWriter;// 添加路由
public void addRoute(RouteDefinition definition) {routeDefinitionWriter.save(Mono.just(definition)).subscribe();publisher.publishEvent(new RefreshRoutesEvent(this)); // 触发刷新
}// 删除路由
public void deleteRoute(String routeId) {routeDefinitionWriter.delete(Mono.just(routeId)).subscribe();publisher.publishEvent(new RefreshRoutesEvent(this));
}

缺点:路由数据不持久化

方案 2:数据库存储 + 定时轮询

实现步骤

  1. 创建路由表:

CREATE TABLE gateway_routes (id VARCHAR(50) PRIMARY KEY,uri VARCHAR(100),predicates JSON,filters JSON,`order` INT
);

  2. 自定义 RouteDefinitionRepository

@Component
public class JdbcRouteDefinitionRepository implements RouteDefinitionRepository {@Autowiredprivate RouteDao routeDao; // 自定义DAO@Overridepublic Flux<RouteDefinition> getRouteDefinitions() {return Flux.fromIterable(routeDao.findAll());}
}

 3. 配置定时刷新(可选):

@Scheduled(fixedRate = 30000)
public void refreshRoutes() {publisher.publishEvent(new RefreshRoutesEvent(this));
}
方案 3:Nacos 配置中心动态监听

实现步骤

  1. 添加依赖:

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

  2. 在Nacos创建配置(Data ID: gateway-routes.json):

[{"id": "user-service","predicates": [{"name": "Path", "args": {"pattern": "/user/**"}}],"uri": "lb://user-service","filters": []
}]

  3.配置监听:

@RefreshScope
@Configuration
public class NacosDynamicRoutes {@Value("${spring.cloud.gateway.routes}")private String routesConfig;@Beanpublic RouteLocator routeLocator(RouteLocatorBuilder builder) {// 解析JSON配置构建路由return builder.routes().build();}
}
方案 4:Redis Pub/Sub 实时通知

实现步骤

  1. 定义Redis消息监听:

@Component
public class RouteUpdateListener {@Autowiredprivate ApplicationEventPublisher publisher;@Beanpublic RedisMessageListenerContainer container(RedisConnectionFactory factory) {RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.addMessageListener((message, pattern) -> {publisher.publishEvent(new RefreshRoutesEvent(this));}, new ChannelTopic("gateway-routes-update"));return container;}
}

  2.修改路由时发布消息: 

redisTemplate.convertAndSend("gateway-routes-update", "refresh");

方案对比

方案实时性持久化复杂度适用场景
内存刷新开发测试
数据库存储中小规模生产环境
Nacos配置中心阿里云体系
Redis Pub/Sub极高高并发分布式系统

 

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

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

相关文章

Flutter 路由守卫全面解析:从原理到实践

路由守卫是现代移动应用开发中不可或缺的重要机制&#xff0c;它如同应用的"安检系统"&#xff0c;在页面跳转前进行必要的检查和拦截。本文将深入探讨 Flutter 中路由守卫的实现原理、多种实现方案以及实际应用场景&#xff0c;帮助开发者构建更安全、更可靠的 Flut…

mysql表备份数据,改表名

mysql表改表名 在MySQL中&#xff0c;直接更改表名并不是一个操作&#xff0c;因为MySQL不允许直接更改表的名称。但是&#xff0c;你可以通过创建一个新表&#xff0c;然后将旧表的数据复制到新表中&#xff0c;最后删除旧表的方式来实现更改表名的目的。这个过程通常被称为“…

开疆智能ModbusTCP转Canopen网关连接汇川AM403PLC与编码器配置案例

二、AM403作为Modbus四主站的配置过程 1.将AM403设为主站 AM403本体带一路EtherNET园囗(CN3)&#xff0c;本例使用该网口作为ModbusTCP通讯口.如下图所示展开项目树&#xff0c;从设备树中找到网络组态(或者Network Configuration): 双击该节点标题打开网络组态设置界面&…

Charles里怎么进行断点调试

Charles进行断点测试的核心目的是通过主动拦截并篡改网络请求与响应数据,构建特定测试场景以验证系统健壮性和逻辑正确性,主要服务于以下关键场景: 🔧 一、验证后端逻辑健壮性 绕过前端校验 修改前端受限参数(如超长字符串、特殊字符),测试后端对异常输入的过滤与容错…

【3D插件推荐】PolyCloth v2.07 超强布料模拟工具(附图文安装教程与下载)

软件介绍 PolyCloth v2.07是一款专为3ds Max设计的布料模拟动画插件&#xff0c;由PolyDesign开发。该插件基于物理动力学模拟&#xff0c;能够为用户提供一个多线程和C的布料画笔工具&#xff0c;帮助用户轻松创建真实感极强的布料动画效果。无论是角色服装还是室内装饰&…

开源综合性网络安全检测和运维工具-TscanClient

开源综合性网络安全检测和运维工具-TscanClient 前言 在当今数字化的时代&#xff0c;网络安全问题日益凸显&#xff0c;企业和个人面临着各种各样的网络威胁。为了有效应对这些威胁&#xff0c;一款强大的网络安全检测和运维工具显得尤为重要。今天&#xff0c;我要给大家介…

MySQL 8.0 OCP 英文题库解析(十五)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题131~140 试题1…

WPF将容器内的组件按比例缩放

1.使用多值转换器,XAML中传入容器的当前宽高,和组件的原始宽高。 <Grid.Height><MultiBinding Converter="{StaticResource SetScaleConverter}"><Binding ElementName="MainWindow1" Path="ActualWidth"></Binding>…

开疆智能ModbusTCP转Devicenet网关连接ABB机器人配置案例

本案例是模拟ModbusTCP主站软件通过开疆智能ModbusTCP转Devicenet网关连接ABB机器人的配置案例&#xff0c;具体过程如下。 配置过程 ABB机器人IO板配置 1、简介 (ABB老版本IO板通讯配置为UNIT&#xff0c;新版本IO板通讯配置为DeviceNet device&#xff0c;此日记以新版本D…

Spring @Qualifier,@Primary

[Q&A] Qualifier 引入背景 在使用 Inject 或 Autowired 进行依赖注入时&#xff0c;默认是 按类型匹配 Bean 的&#xff0c;但如果容器中有多个相同类型的 Bean&#xff0c;Spring 就无法确定该注入哪一个&#xff0c;会抛出异常&#xff1a;NoUniqueBeanDefinitionExcept…

面试遇到的商城项目相关问题总结

今天面试遇到的商城项目相关问题总结 记录一下面试中被问到的和商城项目相关的高频问题和我的实际解答&#xff0c;希望能帮到也在准备前端面试的小伙伴&#xff01; 1. 商城首页、商品列表页怎么做性能优化&#xff1f; 主要从这几个方面展开&#xff1a; 1&#xff09;资…

初探 OpenCV for Android:利用官方示例开启视觉之旅

在移动开发领域&#xff0c;计算机视觉技术的应用越来越广泛&#xff0c;而 OpenCV 作为开源的计算机视觉库&#xff0c;无疑是实现相关功能的强大工具。OpenCV for Android 提供了一系列丰富的示例&#xff0c;帮助开发者快速上手并掌握其在 Android 应用中的使用方法。本文将…

Linux中shell编程的函数递归用法和脚本自动化讲解

一、函数递归 1.1 函数简介 样式1&#xff1a;函数间调用 - 函数体内部调用其他的函数名 样式2&#xff1a;文件间调用 - 函数体内部调用另外一个文件的函数名 - 需要额外做一步文件source的加载动作 注意&#xff1a;我们将专门提供函数的文件称为 -- 函数库…

基于数据库实现配置管理和定时任务启停

本文大纲 1、背景2、实现思路3、基于数据库实现4、总结 1、背景 项目中&#xff0c;定时任务的控制&#xff0c;常常通过配置文件中的开关&#xff0c;但如果定时任务很多&#xff0c;配置文件维护就很烦&#xff0c;且要考虑配置热部署的问题 2、实现思路 上一篇提到了一些…

Linux服务器上MySQL CPU使用率过高问题排查与定位

文章目录 一、CPU高负载常见成因分析1.1 全表扫描与索引缺失1.2 复杂计算与临时表1.3 锁竞争与线程上下文切换1.4 查询优化器误判1.5 硬件资源瓶颈 二、操作系统级初步定位2.1 使用top定位MySQL进程2.2 用pidstat分析线程级CPU2.3 vmstat分析系统负载 三、数据库层深度诊断3.1 …

Java解析前端传来的Unix时间戳

在Java中&#xff0c;前端传递的 1749571200000 是一个 Unix时间戳&#xff08;毫秒级&#xff09;&#xff0c;表示自1970年1月1日00:00:00 UTC以来经过的毫秒数。以下是两种常见的解析方式&#xff08;推荐使用Java 8的java.time API&#xff09;&#xff1a; 方法1&#xff…

error report

build/X86_VI_hammer_GPU/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc: In member function ‘int OutputUnit_d::getVCBufferOccupancy(int)’: build/X86_VI_hammer_GPU/mem/ruby/network/garnet/fixed-pipeline/OutputUnit_d.cc:135:40: error: no matching fu…

本地部署模型 --vLLM + Docker 部署+封装接口

vLLM的介绍 vLLM的核心特性&#xff1a; 最先进的服务吞吐量 使用PageAttention高效管理注意力键和值的内存 量化&#xff1a;GPTQ&#xff0c;AWQ&#xff0c;INT4&#xff0c;INT8和FP8 VLLM的灵活性和易用性体现在以下方面&#xff1a; 具有高吞吐量服务以及各种解码算法…

每日一博 - JWT 安全实战指南

文章目录 Pre引言背景与原理简介核心安全挑战传输层安全实践签名算法与密钥管理Header 与 Claims 严格校验Token 生命周期管理存储与前端实践抗攻击措施日志与监控附加增强与高级方案小结与建议后续方向 引言&#xff1a;阐述 JWT 的流行与安全重要性背景与原理简介&#xff1a…

403 Access Denied Tomcat managerapp

提示 403 Access Denied You are not authorized to view this page. By default the Manager is only accessible from a browser running on the same machine as Tomcat. If you wish to modify this restriction, you’ll need to edit the Manager’s context.xml file.…