网关动态路由原理
📄 网关动态路由原理 _ PIGCLOUD
商业版
生态🔥
快速上手
前端部分
功能使用
后端部分
- 📄 数据库字段文档说明
- 📄 登录 token 生成源码解析
- 📄 请求校验 token 源码解析
- 📄 HTTP客户端获取 token
- 📄 feign 使用基础
- 📄 Feign 调用与令牌传递👍
- 📄 @Inner 注解使用及原理 👍
- 📄 社交短信登录原理
- 📄 接口直接对外暴露
- 📄 前端密码加密处理
- 📄 验证码配置及开关
- 📄 登录短信验证码发送
- 📄 信息推送功能使用
- 📄 配置文件加载规则
- 📄 全局异常处理
- 📄 异常国际化处理
- 📄 配置文件动态刷新
- 📄 网关动态路由原理
- 📄 服务配置 cors 跨域
- 📄 feign 自动降级功能
- 📄 配置文件加解密
- 📄 logback 日志输出配置
- 📄 @SysLog 日志注解使用
- 📄 监控服务常见功能使用
- 📄 Druid 分布式 SQL 监控使用
- 📄 MyBatis-Plus连表查询
扩展必看
生产部署
社区分享
更新日志
📄 网关动态路由原理
pigcloud
# Spring Cloud Gateway 数据库存储路由信息的扩展方案
# Spring Cloud Gateway 路由加载源码
- DispatcherHandler 接管用户请求
- RoutePredicateHandlerMapping 路由匹配
- 根据 RouteLocator 获取 RouteDefinitionLocator
- 返回多个 RouteDefinitionLocator.getRouteDefinitions()的路由定义信息
- FilteringWebHandler 执行路由定义中的 filter 最后路由到具体的业务服务中

# Spring Cloud Gateway 默认动态路由实现
GatewayControllerEndpoint 基于 actuate 端点的默认实现,支持 JVM 级别的动态路由,不能序列化存储

1 | // 上图动态路由的信息保存的默认实现是基于内存的实现 |
# 扩展基于 Mysql + Redis 存储分布式动态组件
# 为什么使用 Mysql 的同时,又要使用 Redis?
spring cloud gateway 基于 webflux 背压,暂时不支持 mysql 数据库
Redis-reactive 支持 spring cloudgateway 的背压,同时还可以实现分布式,高性能
# 扩展思路

- 增加一个路由管理模块,参考 GatewayControllerEndpoint 实现,启动时加载数据库中配置文件到 Redis
- 网关模块重写 RouteDefinitionRepository,getRouteDefinitions()取 Redis 中读取即可实现
- 前端配合 json-view 类似插件,直接修改展示。
# 具体实现
- 路由管理模块核心处理逻辑,获取路由和更新路由
1 | /** |
- 网关自定义 RedisRouteDefinitionRepository
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55/**
* @author lengleng
* @date 2018/10/31
* <p>
* redis 保存路由信息,优先级比配置文件高
*/
public class RedisRouteDefinitionWriter implements RouteDefinitionRepository {
private final RedisTemplate redisTemplate;
public Mono<Void> save(Mono<RouteDefinition> route) {
return route.flatMap(r -> {
RouteDefinitionVo vo = new RouteDefinitionVo();
BeanUtils.copyProperties(r, vo);
log.info("保存路由信息{}", vo);
redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, r.getId(), vo);
return Mono.empty();
});
}
public Mono<Void> delete(Mono<String> routeId) {
routeId.subscribe(id -> {
log.info("删除路由信息{}", id);
redisTemplate.opsForHash().delete(CommonConstant.ROUTE_KEY, id);
});
return Mono.empty();
}
/**
* 动态路由入口
*
* @return
*/
public Flux<RouteDefinition> getRouteDefinitions() {
redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class));
List<RouteDefinitionVo> values = redisTemplate.opsForHash().values(CommonConstant.ROUTE_KEY);
List<RouteDefinition> definitionList = new ArrayList<>();
values.forEach(vo -> {
RouteDefinition routeDefinition = new RouteDefinition();
BeanUtils.copyProperties(vo, routeDefinition);
definitionList.add(vo);
});
log.debug("redis 中路由定义条数: {}, {}", definitionList.size(), definitionList);
return Flux.fromIterable(definitionList);
}
}
Copied!3.库表定义


- Spring Cloud Gateway 路由加载源码
- Spring Cloud Gateway 默认动态路由实现
- 扩展基于 Mysql + Redis 存储分布式动态组件
- 为什么使用 Mysql 的同时,又要使用 Redis?
- 扩展思路
- 具体实现
内容勘误反馈

- 标题: 网关动态路由原理
- 作者: PIGCLOUD
- 创建于 : 2024-01-01 00:00:00
- 更新于 : 2025-09-22 14:27:28
- 链接: https://anime-blog.52lin.site/📄 网关动态路由原理 _ PIGCLOUD/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。