上一篇咱们搞定了 Gateway 的入门搭建,实现了统一入口和动态路由,很多兄弟后台问: "我想给请求加登录校验,网关层统一做,怎么搞?" "我想只有指定年龄段的用户能访问接口,内置的规则满足不了怎么办?" "我想打印所有请求的日志,统计耗时,每个路由都配太麻烦了!"
安排!今天这篇就带大家吃透 Gateway 的断言 + 过滤器全玩法,从内置规则到自定义实现,全是实战干货,看完你也能把网关玩得明明白白!
一、先搞懂:Gateway 的请求处理全流程
在搞进阶玩法之前,咱们先把 Gateway 的工作流程搞明白,不然写自定义代码也是一头雾水:
-
前端请求打到 Gateway 网关;
-
先经过断言工厂判断:这个请求是否匹配当前路由规则?比如路径对不对、时间在不在范围内、参数合不合法;
-
断言匹配通过,就进入过滤器链:先经过前置过滤器处理(比如校验 token、改请求参数、打日志),再转发到对应的微服务;
-
微服务处理完返回响应,再经过后置过滤器处理(比如改响应结果、统计接口耗时),最后返回给前端。
说白了:
-
断言工厂:就是网关的「准入规则」,决定请求能不能进;
-
过滤器工厂:就是网关的「安检环节」,决定请求进来要做什么处理。
二、进阶玩法 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,没登录直接拒绝,再也不用每个微服务都写一遍登录校验了,爽翻!
五、实战高频踩坑总结
-
自定义断言 / 过滤器不生效 排查方向:类上有没有加 @Component 注解?类名是不是以约定的
RoutePredicateFactory/GatewayFilterFactory结尾?配置类的 getter/setter 有没有写? -
全局过滤器执行顺序不对 排查方向:Ordered 接口的 getOrder 方法返回值,数字越小优先级越高,登录校验这种一定要设成高优先级;
-
转发还是 404 排查方向:StripPrefix 的数字对不对?路径前缀有没有正确去掉?微服务的接口路径是不是和转发后的路径一致?
-
还是报 URL 拼写错误 排查方向:lb:// 后面的服务名,是不是和 Nacos 里注册的服务名完全一致?大小写都不能错!
到这,Gateway 的断言、过滤器全玩法就给大家讲透了!从内置规则到自定义实现,从单路由过滤到全服务全局管控,全是实战能用得上的干货。 后续还会给大家更新 Gateway 的限流、熔断、跨域处理等进阶玩法,觉得有用的兄弟点赞收藏关注走一波,有问题评论区一起交流~