在多个网关实例间共享路由 (Sharing Routes)
Spring Cloud Gateway 提供了两种 RouteDefinitionRepository 实现:
- InMemoryRouteDefinitionRepository:路由定义仅存储在单个网关实例的内存中。这种类型的存储库不适合在多个网关实例之间同步或分发路由。
- RedisRouteDefinitionRepository:为了在 Spring Cloud Gateway 实例集群中共享路由,可以使用
RedisRouteDefinitionRepository。
要启用 Redis 路由定义存储库,需要将以下属性设置为 true: spring.cloud.gateway.redis-route-definition-repository.enabled=true
与 RedisRateLimiter 过滤器工厂类似,它需要使用 spring-boot-starter-data-redis-reactive Spring Boot starter 依赖。
补充教学 —— 为什么需要 Redis 共享路由?
1. 从“单机”到“集群”的跨越 在生产环境中,为了高可用和负载均衡,我们通常会部署多个网关实例(比如 3 个 Gateway 节点)。
- 内存模式的局限:如果你通过 Actuator 接口向网关 A 发送了一个 POST 请求新增了一条路由,这条路由只存在于网关 A 的内存里。网关 B 和 C 根本不知道这条路由的存在。这会导致流量分发不均,甚至请求 404。
- Redis 模式的优势:所有网关实例都连接到同一个 Redis 数据库。当你向其中任何一个网关添加路由时,配置都会被持久化到 Redis。
2. 核心工作原理
- 存储结构:
RedisRouteDefinitionRepository会将路由定义以 JSON 字符串的形式存入 Redis 的 Hash 结构中。 - 动态加载:当网关需要处理请求时,它会从
RouteDefinitionLocator(此时由 Redis 存储库驱动)中读取路由定义。
3. 避坑指南:它不包含“自动同步” 这是一个非常重要的误区:向网关 A 写入路由到 Redis,并不意味着网关 B 会立即感知并刷新。 虽然路由数据在 Redis 里了,但网关实例通常会缓存路由信息以保证性能。
- 解决办法:在向 Redis 写入新路由后,你依然需要通过 Actuator 的
/actuator/gateway/refresh接口通知其他所有网关实例刷新其本地缓存,或者使用 Redis 的消息订阅(Pub/Sub)机制结合自定义事件来实现自动刷新。
4. 总结 如果你只是用 YAML 配置路由,那么不需要这个功能(因为每个实例启动时都会读取相同的 YAML)。这个功能专门为“通过 API 动态管理路由”且“多节点部署”的架构设计。