微服务网关Zuul过滤器Filter

Zuul本质

Zuul是一个网关,关于网关的介绍参考:亿级流量架构之网关设计思路、常见网关对比, 可知Zuul是一个业务网关, 而深入了解Zuul, 基本就是一系列过滤器的集合:

img

Zuul的过滤器

下面开始详细了解Zuul的过滤器, 主要有pre、rout、post、error四种过滤器类型,将这个整明白了, zuul的使用就过大半了。

四种类型过滤器调用顺序:

过滤器类型定义在filterType方法中, 返回一个字符串代表过滤器的类型,在zuul中定义的四种不同生命周期的过滤器类型,主要功能如下:

  • pre:在请求被路由之前调用, 利用这种路由器进行鉴权等服务, 记录日志、 限流
  • route:在路由请求时候被调用,作用是将请求路由到指定服务中去, 用于构建发送给微服务的请求, 并且用Http Client(或者Ribbon)请求微服务
  • post:在route和error过滤器之后被调用,可以用来添加Header , 记录日志, 将响应返回给客户端。
  • error:处理请求时发生错误时调用

从pre和route阶段抛出的异常将会进入error阶段,再进入到post阶段进行返回。由于SendErrorFilter需要判断请求上下文中是否包含error.status_code属性:有的话就用SendErrorFilter处理错误结果;没有的话就用SendResponseFilter返回正常结果,但是error.status_code属性默认是在各个阶段过滤器中自己put进去的,这就导致,各个阶段过滤器抛出异常之后,是没有办法返回错误结果的。因此,我们扩展了一个ErrorFilter来捕获异常,然后手工的设置error.status_code属性,让SendErrorFilter能正常运作。

每一种处理器具体细分多种, 参考图(利用谷歌检索难以搜到图的来源, 这儿给出我参考博客的地址):

需要记住几个常见的, Route中有三种过滤器, 分别是:

RibbonXXXFilter : 路由到服务

SimpleHostRoutingFilter : 路由到URL地址

SendForwardFilter : 转向Filter自己

Filter流程以及参数解释

创建过滤器, 一般是先继承ZuulFilter然后重写里面的方法,分别是:

filterType : 指定过滤器的类型, 分别是上文提到的四种,pre route post error

**filterOrder **: 指定过滤器执行顺序, 数字越小越先执行

shouldFilter : 是否执行这个过滤器, 也就是上来就看这儿是true还是false, false的话就不执行这个过滤器的逻辑。

**run **: 过滤器执行的逻辑, 这一般是过滤器的重点内容。

下面示例一个限流过滤器:

@Component // 交给Spring管理 public class LimitFilter extends ZuulFilter { @Override //指定类型为pre public String filterType() { return FilterConstants.PRE_TYPE; } @Override // 执行执行等级 public int filterOrder() { return -10; } @Override // 是否执行 public boolean shouldFilter() { return true; } //创建令牌 private static final RateLimiter RATE_LIMITER = RateLimiter.create(5); @Override public Object run() throws ZuulException { //拿到请求上下文 RequestContext currentContext = RequestContext.getCurrentContext(); if (RATE_LIMITER.tryAcquire()){ System.out.println("通过"); return null; }else { System.out.println("被限流了"); currentContext.setSendZuulResponse(false); currentContext.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value()); } return null; } }

需要注意的是, 之前说过pre执行顺序比post高, 也就意味着即使post执行等级比pre的小的话, pre过滤器还是会优先执行, filterOrder只在同一级别的过滤器中才会被考虑。


__EOF__

本文作者等不到的口琴
本文链接https://www.cnblogs.com/Courage129/p/14517275.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   等不到的口琴  阅读(3533)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示