SpringCloud学习系列之七 ----- Zuul路由网关的过滤器和异常处理

在上篇中介绍了SpringCloud Zuul路由网关的基本使用版本,本篇则介绍基于SpringCloud(基于SpringBoot2.x,.SpringCloud Finchley版)中的路由网关的过滤器Filter以及异常处理的教程。

SpringCloud Zuul Filter 介绍

过滤器概述

Zuul的中心是一系列过滤器,能够在HTTP请求和响应的路由过程中执行一系列操作。

以下是Zuul过滤器的主要特征:

类型:通常在应用过滤器时在路由流程中定义阶段(尽管它可以是任何自定义字符串)

执行顺序:在类型中应用,定义跨多个过滤器的执行顺序

标准:执行过滤器所需的条件

操作:满足条件时要执行的操作

Zuul提供了一个动态读取,编译和运行这些过滤器的框架。过滤器不直接相互通信 - 而是通过RequestContext共享状态,RequestContext对每个请求都是唯一的。

过滤器目前用Groovy编写,尽管Zuul支持任何基于JVM的语言。每个Filter的源代码都写入Zuul服务器上的一组指定目录,这些目录会定期轮询更改。更新的过滤器从磁盘读取,动态编译到正在运行的服务器中,并由Zuul为每个后续请求调用。

过滤器类型与请求生命周期

Zuul大部分功能都是通过过滤器来实现的。Zuul中定义了四种标准过滤器类型,这些过滤器类型对应于请求的典型生命周期。

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

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

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

ERROR:在其他阶段发生错误时执行该过滤器。

官网Wiki 提供的四种过滤器的生命周期图。

在这里插入图片描述

:此段来之Netflix / zuul的官网Wiki,地址:https://github.com/Netflix/zuul/wiki/How-it-Works。

开发准备

开发环境

JDK:1.8

SpringBoot:2.0.6.RELEASE

SpringCloud:Finchley.SR2

注:不一定非要用上述的版本,可以根据情况进行相应的调整。需要注意的是SpringBoot2.x以后,jdk的版本必须是1.8以上!

服务端

由于在上一篇中我们已经完成了Zuul路由网关的基本功能实现,所以服务端这块我们可以直接把之前的项目拿来直接使用,然后更改相应的名称以及相关代码即可。

自定义过滤器

这里我们来编写自定义一个Filter实现类,看看该类是如何工作的。
在编写该类的时候,发现自定义的Filter类需要继承ZuulFilter这个类,我们查看该类的源码,发现了该类定义了两个抽象的方法,并且该类实现了IZuulFilter该接口,该接口也定义了两个方法,我们就来看看这几个方法到底是干嘛的吧。

ZuulFilter源码:

在这里插入图片描述

filterType这个方法表示按类型对过滤器进行分类,分别是pre、post、route和error,在FilterConstants这个常量类中已经进行定义了,其意义在上述的Filter请求的典型生命周期已经进行过说明了。
filterOrder 这个方法表示Filter执行的顺序,数值越小优先级越高。

IZuulFilter

在这里插入图片描述

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

看完上述的源码之后,这里我们再来编写自定的Filter代码。
首先继承ZuulFilter该类,然后实现里面的方法。
首先是shouldFilter方法,这里我们就直接返回true;
然后是filterType,这里我们就设置为前置过滤器,在请求被路由之前调用。
继而是filterOrder,这里我们就设置0;
最后是run,这是过滤器的核心业务代码,这里我们就简单一点,获取请求的url,如果该url携带了token,我们就让他通过,否则直接拦截。
当然,我们需要将该过滤类使用Bean注解使其生效。
那么代码如下:

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

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