白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理

简单介绍了关于Zuul的一些简单使用以及一些路由规则的简单说明。而对于一个统一网关而言,需要处理各种各类的请求,对不同的url进行拦截,或者对调用服务的异常进行二次处理等等。今天,我们就来了解下这方面的相关知识点。

一点知识

开始实践前,我们先来了解下Zuul默认的过滤器(注意,这里讲解的Zuul都是1.X版本的)。上一章节,也提到了Zuul的核心就是一系列过滤器。现在我们来看看Zuul的过滤器相关信息。

过滤器的定义

Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

PRE:可以在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

ROUTING:在路由请求时候被调用。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

POST:在routing和error过滤器之后被调用。这种过滤器可用来为响应添加标准的HTTP Header、收集统计信息和指标、将响应从微服务发送给客户端等。

ERROR:处理请求时发生错误时被调用。

现在看下官网wiki提供的四种过滤器的生命周期图。

zuul请求生命周期

一个请求会先按顺序通过所有的前置过滤器,之后在路由过滤器中转发给后端应用,得到响应后又会通过所有的后置过滤器,最后响应给客户端。在整个流程中如果发生了异常则会跳转到错误过滤器中。

一般来说,如果需要在请求到达后端应用前就进行处理的话,会选择pre(前置过滤器),例如鉴权、请求转发、增加请求参数等行为。在请求完成后需要处理的操作放在(post)后置过滤器中完成,例如统计返回值和调用时间、记录日志、增加跨域头等行为。路由过滤器一般只需要选择 Zuul 中内置的即可,错误过滤器一般只需要一个,这样可以在遇到错误逻辑时直接抛出异常中断流程,并直接统一处理返回结果

说下error过滤器:pre、routing的任意一个阶段如果抛异常了,则执行error过滤器,然后再执行post给出响应。而post异常了,就直接调用error了。

过滤器接口定义

知道了过滤器的定义,我们看看过滤器是怎么被定义的。查看类com.netflix.zuul.ZuulFilter类,可知其个抽象类:
以下为需要实现的方法,其他具体的可自行查阅下

//过滤器类型 String filterType(); //执行顺序 越小越先执行 int filterOrder(); //是否执行 返回false 不执行此过滤器 boolean shouldFilter(); //过滤器执行逻辑 Object run();

具体说明下:

filterType:该函数需要返回一个字符串来代表过滤器的类型,而这个类型就是在HTTP请求过程中定义的各个阶段。在Zuul中默认定义了四种不同生命周期的过滤器类型,具体如下:

pre:可以在请求被路由之前调用。

routing:在路由请求时候被调用。

post:在routing和error过滤器之后被调用。

error:处理请求时发生错误时被调用。

filterOrder:通过int值来定义过滤器的执行顺序,数值越小优先级越高。

shouldFilter:返回一个boolean类型来判断该过滤器是否要执行。我们可以通过此方法来指定过滤器的有效范围。

run:过滤器的具体逻辑。在该函数中,我们可以实现自定义的过滤逻辑,来确定是否要拦截当前的请求,不对其进行后续的路由,或是在请求路由返回结果之后,对处理结果做一些加工等。

所以,了解了过滤器抽象类的定义,自定义抽象类就简单了。

zuul自带过滤器

通过IDE我们来看下已经实现ZuulFilter的过滤器类。具体的类在:

白话SpringCloud | 第十章:路由网关(Zuul)进阶:过滤器、异常处理

看看已经提供的过滤器:

自带的filter

可以看见,Spring cloud zuul提供了很多过滤器,基本上就开箱即用了。简单说明下:

类型 顺序 过滤器 功能
pre   -3   ServletDetectionFilter   标记处理Servlet的类型  
pre   -2   Servlet30WrapperFilter   包装HttpServletRequest请求  
pre   -1   FormBodyWrapperFilter   包装请求体  
pre   1   DebugFilter   标记调试标志  
pre   5   PreDecorationFilter   处理请求上下文供后续使用  
route   10   RibbonRoutingFilter   serviceId请求转发  
route   100   SimpleHostRoutingFilter   url请求转发  
route   500   SendForwardFilter   forward请求转发  
error   0   SendErrorFilter   处理有错误的请求响应  
post   1000   SendResponseFilter   处理正常的请求响应  
禁用过滤器

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzjgzx.html