当前位置: 首页 > news >正文

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极高高并发分布式系统

 

相关文章:

  • 怎样解决在ubuntu 22.04上QT: DataVisualization控件显示黑屏的问题
  • Doris集群安装部署
  • Rust 学习笔记:关于通过异步实现并发的练习题
  • 《C++初阶之类和对象》【类 + 类域 + 访问限定符 + 对象的大小 + this指针】
  • DEVICENET转MODBUS TCP网关连接DeviceNet数字远程IO模块配置案例
  • uniapp小程序不支持动态组件问题
  • 更进一步深入的研究ObRegisterCallBack
  • 【iSAQB软件架构】以架构为中心的开发方法
  • node-red的http-request组件调研三方接口请求参数为form-data解决方案
  • 基于算力魔方与PP-OCRv5的OpenVINO智能文档识别方案
  • 零基础RT-thread第一节:串口通信UART
  • 基于大模型预测的上睑下垂综合诊疗技术方案
  • Java大厂面试真题:谢飞机的技术挑战
  • 每日算法刷题Day29 6.12:leetcode二分答案4道题,用时1h10min
  • 多线程安全:核心解决方案全解析
  • 商业智能中的地图可视化模板:助力数据高效呈现
  • C++ Vector深度解析:动态组的底层机制与实战指南
  • 林业资源多元监测技术守护绿水青山
  • 第 4 篇:线性回归——机器学习“开山第一斧”,用一条直线洞见AI本质
  • python 在基因研究中的应用,博德研究所:基因编辑
  • seo外链要做些什么/杭州最好的seo公司
  • 企业网站建设合同/在百度怎么免费发布广告
  • 网站开发 英语词汇/永久开源的免费建站系统
  • 哪些网站可以做任务赚钱/seo常用工具网站
  • 网站微信分享链接怎么做的/优化大师在哪里
  • php 做视频网站/保定百度seo排名