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

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.xdnf.cn/news/13748.html

相关文章:

  • Android NTP自动同步时间机制
  • 记录一个大模型逐层微调计算损失输出少了一个维度的小bug
  • Three.js搭建小米SU7三维汽车实战(4)场景搭建
  • 【时时三省】(C语言基础)将外部变量的作用域扩展到其他文件
  • 计算复变积分 $w = \int_0^1 (1 + it)^2 \, dt$
  • 【清晰教程】可视化数据集标注工具Labelimg零基础安装
  • openstack实例创建过程分析
  • 深度掌控,智启未来 —— 基于 STM32F103RBT6 的控制板
  • 离线部署openstack 2024.1 cinder
  • pangolin
  • 全连接层和卷积层等效情况举例
  • 离线部署openstack 2024.1控制节点keystone
  • Design Compiler:使用read_file命令读取RTL设计
  • Python Day 48 学习(日志Day18学习)
  • 谷歌被禁用的麦克风如何能使用
  • 榕壹云打车系统:赋能出租与网约车的全场景解决方案
  • 阿里1688 普通 231滑块 x82 分析
  • 前端将多个PDF链接的内容拼接成一个后返回出一个链接进行打开
  • 一起学习swin-transformer(一)
  • STM32开发GCC常用编译选项
  • 计组刷题日记(1)
  • 快速熟悉公司的服务器开发环境需要系统
  • 软件测试之APP测试要点(包含Monkey基础使用)
  • 如何创建vue工程?以及遇到问题的解决方法
  • vue3提供的hook和通常的函数有什么区别
  • Python直接访问Windows API库之pywin32使用详解
  • mysql递归查询所有父节点拼接父节点名称
  • 使用Gradle打包springboot项目为JAR包教程
  • 蓝凌EKP产品:低门槛、可扩展、可视化公式引擎应用示例
  • 功能化组件编码流程-2(延续上一章)