第二篇:从复制粘贴到自定义规则!Spring Cloud Gateway 断言 + 过滤全玩法,拿捏微服务流量管控

上一篇咱们搞定了 Gateway 的入门搭建,实现了统一入口和动态路由,很多兄弟后台问: "我想给请求加登录校验,网关层统一做,怎么搞?" "我想只有指定年龄段的用户能访问接口,内置的规则满足不了怎么办?" "我想打印所有请求的日志,统计耗时,每个路由都配太麻烦了!"

安排!今天这篇就带大家吃透 Gateway 的断言 + 过滤器全玩法,从内置规则到自定义实现,全是实战干货,看完你也能把网关玩得明明白白!


一、先搞懂:Gateway 的请求处理全流程

在搞进阶玩法之前,咱们先把 Gateway 的工作流程搞明白,不然写自定义代码也是一头雾水:

  1. 前端请求打到 Gateway 网关;

  2. 先经过断言工厂判断:这个请求是否匹配当前路由规则?比如路径对不对、时间在不在范围内、参数合不合法;

  3. 断言匹配通过,就进入过滤器链:先经过前置过滤器处理(比如校验 token、改请求参数、打日志),再转发到对应的微服务;

  4. 微服务处理完返回响应,再经过后置过滤器处理(比如改响应结果、统计接口耗时),最后返回给前端。

说白了:

  • 断言工厂:就是网关的「准入规则」,决定请求能不能进;

  • 过滤器工厂:就是网关的「安检环节」,决定请求进来要做什么处理。

二、进阶玩法 1:自定义断言工厂,自己定准入规则

Gateway 内置了很多断言工厂,比如路径匹配、时间匹配、Cookie 匹配、Header 匹配等等,但业务里总有奇奇怪怪的个性化需求,比如:

需求:只有请求参数里的 age 在 18-60 岁之间的用户,才能访问这个路由的接口

内置的断言满足不了?没关系,咱们自己写一个断言工厂,分分钟搞定!

1. 自定义断言工厂编写

这里教大家一个偷懒小技巧:直接抄 Gateway 内置断言工厂的结构,改业务逻辑就行,绝对不会出错! 核心要求:

  • 类名必须以RoutePredicateFactory结尾,这是 Gateway 的约定;

  • 继承AbstractRoutePredicateFactory类,重写核心方法;

  • 定义一个配置类,接收 yml 里配置的参数。

咱们就以这个年龄校验为例,代码直接给你们写好:

复制代码
2. 配置文件里使用自定义断言

写完之后,直接在 yml 里配置就行,超简单:

复制代码

就这么简单!现在只有请求里带了 age 参数,且值在 18-60 之间的请求,才会被转发,不然直接返回 404,个性化规则直接拿捏!

三、进阶玩法 2:过滤器工厂,请求响应全管控

断言搞定了准入,接下来就是过滤器,这才是网关最常用的功能,权限校验、参数改写、日志打印、限流全靠它。

1. 先讲超高频的内置过滤器:StripPrefix

新手最容易踩的 404 坑,90% 都是没加这个过滤器! 举个例子: 你的请求路径是http://网关地址/consumer/order/getById,你想转发到微服务的/order/getById接口。 如果不加 StripPrefix,网关会把完整的/consumer/order/getById路径直接转发给微服务,而微服务里根本没有/consumer开头的接口,直接 404!

这时候 StripPrefix 就派上用场了,它的作用就是去掉路径里的 N 层前缀

复制代码

就这一行配置,直接解决路径转发 404 的问题,新手必记!

2. 自定义过滤器工厂,个性化处理请求

内置过滤器不够用?咱们自己写!比如需求:给指定路由开启请求日志打印,配置Log=true就开启,false 就关闭。

同样,直接抄内置过滤器的结构,分分钟搞定:

复制代码
3. 配置使用自定义过滤器

直接在 yml 里配置,想给哪个路由加,就给哪个路由配:

复制代码

就这么简单,指定路由的请求日志就全给你打印出来了,想关的话改成 false 就行,灵活度拉满!

四、进阶玩法 3:全局过滤器,全服务统一管控

上面的过滤器是针对单个路由的,那如果我想给所有请求都加登录校验,总不能每个路由都配一遍过滤器吧? 这时候全局过滤器 GlobalFilter就来了!它会作用于所有的路由,不用在 yml 里配置,写好直接生效,全服务统一管控。

最常用的场景就是统一登录校验,咱们直接上代码:

复制代码

就这么一个类,直接搞定全服务的统一登录校验!所有请求进来先校验 token,没登录直接拒绝,再也不用每个微服务都写一遍登录校验了,爽翻!

五、实战高频踩坑总结

  1. 自定义断言 / 过滤器不生效 排查方向:类上有没有加 @Component 注解?类名是不是以约定的RoutePredicateFactory/GatewayFilterFactory结尾?配置类的 getter/setter 有没有写?

  2. 全局过滤器执行顺序不对 排查方向:Ordered 接口的 getOrder 方法返回值,数字越小优先级越高,登录校验这种一定要设成高优先级;

  3. 转发还是 404 排查方向:StripPrefix 的数字对不对?路径前缀有没有正确去掉?微服务的接口路径是不是和转发后的路径一致?

  4. 还是报 URL 拼写错误 排查方向:lb:// 后面的服务名,是不是和 Nacos 里注册的服务名完全一致?大小写都不能错!


到这,Gateway 的断言、过滤器全玩法就给大家讲透了!从内置规则到自定义实现,从单路由过滤到全服务全局管控,全是实战能用得上的干货。 后续还会给大家更新 Gateway 的限流、熔断、跨域处理等进阶玩法,觉得有用的兄弟点赞收藏关注走一波,有问题评论区一起交流~

相关推荐
SamDeepThinking1 小时前
C端多渠道用户体系设计:从需求到落地
java·后端·架构
天若有情6732 小时前
反向封神!C++ 全局单例不避反用,实现无锁多线程函数独占访问
java·javascript·c++
风曦Kisaki2 小时前
# 企业级网络架构Day03:网络层解析、路由原理、三层交换机、动态路由(OSPF)
网络·架构·智能路由器
凤凰院凶涛QAQ2 小时前
《C++转JAVA快速入手系列》:基本通用语法篇
java·开发语言·c++
千寻girling2 小时前
机器学习 | 逻辑回归 | 尚硅谷学习
java·人工智能·python·学习·算法·机器学习·逻辑回归
Javatutouhouduan2 小时前
阿里2026最新Java面试核心讲(终极版)
java·java面试·java并发·后端开发·java程序员·java八股文·java性能优化
wljt2 小时前
SpringBoot学习笔记五:Spring Boot的web开发
spring boot·笔记·学习
richard_yuu2 小时前
软件架构三大编程范式|结构化、面向对象、函数式,该怎么选?
架构
Shadow(⊙o⊙)2 小时前
C++常见错误解析2.0
开发语言·数据结构·c++·后端·学习·算法