spring cloud gateway动态路由核心是替换routedefinitionlocator为外部数据源实现、使用routedefinitionrepository作为读写中枢、通过refreshroutesevent触发cachingroutelocator刷新缓存;支持nacos监听或数据库api两种落地方式,需配置actuator端点、唯一routedefinitionrepository bean及正确解析predicate/filter。

Spring Cloud Gateway 实现动态路由加载与内存刷新,核心在于绕过启动时的静态装配机制,改用可实时变更的数据源 + 事件驱动刷新。不重启、不重载应用,就能让新增或修改的路由立即生效。
关键接口与类的作用
理解以下三个接口是动手的前提:
-
RouteDefinitionLocator:负责“读取”路由定义(
Flux<routedefinition></routedefinition>),默认从 yml 加载(PropertiesRouteDefinitionLocator);要动态化,就得替换为从数据库/Nacos/Redis 等外部源读取的自定义实现。 -
RouteDefinitionRepository:继承了
RouteDefinitionLocator和RouteDefinitionWriter,是动态路由的“中枢”。它既提供读(getRouteDefinitions()),也支持写(save()、delete())。网关默认使用InMemoryRouteDefinitionRepository(内存 Map 存储),你可以直接扩展它,或完全重写为持久化版本。 -
RefreshRoutesEvent:发布该事件后,
CachingRouteLocator会监听并清空本地缓存,再调用RouteDefinitionLocator.getRouteDefinitions()重新拉取最新路由——这是刷新内存的触发开关。
两种主流落地方式
选一种即可,按团队技术栈和运维习惯决定:
-
基于配置中心(如 Nacos)+ 监听刷新:把路由 JSON 数组(如
[{"id":"user","uri":"lb://user-service",...}])放在 Nacos 的 dataId 中;在网关中用ConfigService.addListener()监听变更;收到新配置后,解析为RouteDefinition列表,存入自定义RouteDefinitionRepository,再发布RefreshRoutesEvent。 -
基于数据库 + HTTP API 管理:建表存储
id、uri、predicates_json、filters_json等字段;提供增删改查 REST 接口;接口内部调用routeDefinitionWriter.save()写入仓库,并同步发RefreshRoutesEvent;RouteDefinitionRepository.getRouteDefinitions()方法则改为查询数据库并映射为RouteDefinition流。
必须配置的支撑项
缺一不可,否则动态逻辑无法触发:
- 引入
spring-boot-starter-actuator,暴露/actuator/gateway/refresh端点(手动触发刷新,适合调试); - 确保 Spring 容器中有且仅有一个
RouteDefinitionRepositoryBean(移除默认的@ConditionalOnMissingBean冲突,或用@Primary标注你的实现); - 若用 Nacos,需启用
@RefreshScope(配合spring-cloud-starter-alibaba-nacos-config);若用数据库,确保事务与 JSON 字段解析健壮(推荐 JacksonObjectMapper处理 predicates/filters); - 所有自定义
PredicateDefinition或FilterDefinition的 name 字段,必须对应 Gateway 内置工厂(如"Path"、"StripPrefix"),否则解析失败静默丢弃。
验证是否生效的小技巧
刷新后快速确认路由已更新:
- 访问
http://网关地址/actuator/gateway/routes(需开启management.endpoints.web.exposure.include=gateway),查看返回 JSON 中是否包含新路由 ID; - 用
curl -X POST http://网关地址/actuator/gateway/refresh手动触发一次刷新,观察日志是否有RefreshRoutesEvent received和Updating route cache; - 发起一个匹配新路由 predicate 的请求(如
GET /new-path),看能否正确转发到目标服务,且响应头中带X-Gateway-Routed: true类似标识(可自行加全局 filter 打印)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











