一、前言
- 一般Gateway配置路由会在配置文件中写死,如下
spring: |
- 当我们想添加新路由的时候还得,在routes中添加新路由然后重启服务
- 这样显然是不太合理的,那路由是不是可以动态获取与更新呢(废话)
二、实现思路
- 在Gateway启动的时候,读取nacos的路由信息配置,然后刷到Gateway路由
- 监听nacos信息变化,如果配置修改了,重新调用Gateway刷新事件,刷新最新路由信息
- Gateway的路由信息,默认是保存在内存中的,可查看
GatewayAutoConfiguration
源码
** |
- 默认就是
InMemoryRouteDefinitionRepository
,实现了RouteDefinitionRepository
,底层是一个线程安全的Map:SynchronizedMap
- 其中注解
@ConditionalOnMissingBean(RouteDefinitionRepository.class)
表示RouteDefinitionRepository没有实现类时,使用InMemoryRouteDefinitionRepository
实现动态路由
方法1
- 既然知道了 路由信息 是保存在内存中,那我们可以自定义路由保存的位置,如:redis 等
- 只需要继承
RouteDefinitionRepository
接口,重写其中的三个方法逻辑即可
// 获取所有路由信息 |
- 他们的save和delete都是
RouteDefinitionWriter
接口的方法
方法二
- 监听Nacos的路由配置变化,Nacos变化了,我们这边收到数据
- 收到数据之后,发布刷新路由事件,通知所有存储路由的组件更新路由即可
1、自定义动态路由发布事件
- 实现Spring的
ApplicationEventPublisherAware
接口。 - 初始化时监听Nacos路由配置信息,注入:
RouteDefinitionWriter
更新InMemoryRouteDefinitionRepository
数据,并发布RefreshRoutesEvent
事件 - 完整代码如下:
/** |
- 配置文件内容:
spring: |
2、Nacos配置路由信息
- Nacos中的gateway_route配置内容如下:
[{ |
- 启动网关服务,查看控制台
- 每个json对象都是一个:
org.springframework.cloud.gateway.route.RouteDefinition
- MyRequestRateLimiter 这个是我随便配置的Redis限流,也是生效的
自此就Gateway动态路由就结束了,完整SpringCloud-alibaba示例源码如下: