Spring Cloud Gateway 动态路由实现方案

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

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

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

java 复制代码
@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. 创建路由表:
sql 复制代码
CREATE TABLE gateway_routes (
  id VARCHAR(50) PRIMARY KEY,
  uri VARCHAR(100),
  predicates JSON,
  filters JSON,
  `order` INT
);
  1. 自定义 RouteDefinitionRepository
java 复制代码
@Component
public class JdbcRouteDefinitionRepository implements RouteDefinitionRepository {
    
    @Autowired
    private RouteDao routeDao; // 自定义DAO

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        return Flux.fromIterable(routeDao.findAll());
    }
}
  1. 配置定时刷新(可选):
java 复制代码
@Scheduled(fixedRate = 30000)
public void refreshRoutes() {
    publisher.publishEvent(new RefreshRoutesEvent(this));
}
方案 3:Nacos 配置中心动态监听

实现步骤

  1. 添加依赖:
XML 复制代码
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. 在Nacos创建配置(Data ID: gateway-routes.json):
XML 复制代码
[{
  "id": "user-service",
  "predicates": [{"name": "Path", "args": {"pattern": "/user/**"}}],
  "uri": "lb://user-service",
  "filters": []
}]

3.配置监听:

java 复制代码
@RefreshScope
@Configuration
public class NacosDynamicRoutes {
    
    @Value("${spring.cloud.gateway.routes}")
    private String routesConfig;

    @Bean
    public RouteLocator routeLocator(RouteLocatorBuilder builder) {
        // 解析JSON配置构建路由
        return builder.routes().build();
    }
}
方案 4:Redis Pub/Sub 实时通知

实现步骤

  1. 定义Redis消息监听:
java 复制代码
@Component
public class RouteUpdateListener {
    
    @Autowired
    private ApplicationEventPublisher publisher;

    @Bean
    public 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.修改路由时发布消息:

java 复制代码
redisTemplate.convertAndSend("gateway-routes-update", "refresh");

方案对比

方案 实时性 持久化 复杂度 适用场景
内存刷新 开发测试
数据库存储 中小规模生产环境
Nacos配置中心 阿里云体系
Redis Pub/Sub 极高 高并发分布式系统
相关推荐
小小管写大大码9 分钟前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
zhang1338308907535 分钟前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
a413244738 分钟前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler1 小时前
buildroot System configuration
java·服务器·数据库
津津有味道1 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
layman05282 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔2 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李2 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN2 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒2 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局