Spring Cloud Zuul过滤器详解

开端

阅读本文,您将了解:

(1) Zuul过滤器类型与请求生命周期

(2) 如何编写Zuul过滤器

(3) 如何禁用Zuul过滤器

(4) Spring Cloud为Zuul编写的过滤器及其功能。

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

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

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

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

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

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

除了默认的过滤器类型,Zuul还允许我们创建自定义的过滤器类型。例如,我们可以定制一种STATIC类型的过滤器,直接在Zuul中生成响应,而不将请求转发到后端的微服务。

Zuul请求的生命周期如图8-5所示,该图详细描述了各种类型的过滤器的执行顺序。

编写Zuul过滤器

理解过滤器类型和请求生命周期后,我们来编写一个Zuul过滤器。编写Zuul的过滤器非常简单,我们只需继承抽象类ZuulFilter,然后实现几个抽象方法就可以了。

那么现在,我们来编写一个简单的Zuul过滤器,让该过滤器打印请求日志。

(1) 复制项目microservice-gateway-zuul,将ArtifactId修改为microservice-gateway-zuul-filter。

(2) 编写自定义Zuul过滤器

public class PreRequestLogFilter extends ZuulFilter {

private static final Logger LOGGER = LoggerFactory.getLogger(PreRequestLogFilter.class);

@Override

public String filterType() {

return "pre";

}

@Override

public int filterOrder() {

return 1;

}

@Override

public boolean shouldFilter() {

return true;

}

@Override

public Object run() {

RequestContext ctx = RequestContext.getCurrentContext();

HttpServletRequest request = ctx.getRequest();

PreRequestLogFilter.LOGGER.info(String.format("send %s request to %s", request.getMethod(), request.getRequestURL().toString()));

return null;

}

}

由代码可知,自定义的Zuul Filter需实现以下几个方法:

filterType:返回过滤器的类型。有pre、route、post、error等几种取值,分别对应上文的几种过滤器。详细可以参考com.netflix.zuul.ZuulFilter.filterType() 中的注释。

filterOrder:返回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字。

shouldFilter:返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。

run:过滤器的具体逻辑。本例中,我们让它打印了请求的HTTP方法以及请求的地址。

(2) 修改启动类,为启动类添加以下内容:

1234 @Beanpublic PreRequestLogFilter preRequestLogFilter() {return new PreRequestLogFilter();}

测试

(1) 启动microservice-discovery-eureka。

(2) 启动microservice-provider-user。

(3) 启动microservice-gateway-zuul-filter。

(4) 访问http://localhost:8040/microservice-provider-user/1 ,可获得类似如下的日志。

[nio-8040-exec-6] c.i.c.s.filters.pre.PreRequestLogFilter : send GET request to http://localhost:8040//microservice-provider-user/1

说明我们编写的自定义Zuul过滤器被执行了。

禁用Zuul过滤器

Spring Cloud默认为Zuul编写并启用了一些过滤器,例如DebugFilter、FormBodyWrapperFilter、PreDecorationFilter等。这些过滤器都存放在spring-cloud-netflix-core这个Jar包的org.springframework.cloud.netflix.zuul.filters包中。

一些场景下,我们想要禁用掉部分过滤器,此时该怎么办呢?

答案非常简单,只需设置zuul.<SimpleClassName>.<filterType>.disable=true ,即可禁用SimpleClassName所对应的过滤器。以过滤器org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter为例,只需设置zuul.SendResponseFilter.post.disable=true ,即可禁用该过滤器。

同理,如果想要禁用《编写Zuul过滤器》一节编写的过滤器,只需设置zuul.PreRequestLogFilter.pre.disable=true 即可。

TPS

(1) 相关代码com.netflix.zuul.ZuulFilter.disablePropertyName()、com.netflix.zuul.ZuulFilter.isFilterDisabled()、com.netflix.zuul.ZuulFilter.runFilter()。

版权声明

本文采用CC BY 3.0 CN协议进行许可。 可自由转载、引用,但需署名作者且注明文章出处。如需转载至公众号,请在文末添加作者公众号二维码。

原文发布于微信公众号 - A周立SpringCloud(gh_e6849e368b5f)

原文发表时间:2017-02-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Lambda

TortoiseSVN文件夹及文件图标不显示解决方法 TortoiseSVN文件夹及文件图标不显示解决方法

TortoiseSVN文件夹及文件图标不显示解决方法           由于自己的电脑是win7(64位)的,系统安装TortoiseSVN之后,其他的功...

24380
来自专栏一个会写诗的程序员的博客

NodeJS 发送 POST 请求 curl -d & JS 类的静态属性使用

13520
来自专栏一个爱瞎折腾的程序猿

asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

开局一张图,然后开始编,一些基本的asp.net core东西就不再赘述,本文只对Swashbuckle.AspNetCore的几个使用要点进行描述。

19610
来自专栏PhpZendo

Laravel 服务提供者指南

如果你使用过 Laravel 框架的话,那么,你不可能没听说过服务容器和服务提供者。事实上,它们是 Lavavel 框架核心,它们完成 Larvel 应用中服务...

18100
来自专栏大内老A

如何利用ETW(Event Tracing for Windows)记录日志

ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统。由于采用内核(Kernel)层面的缓冲和日志记...

250100
来自专栏唐维黎的专栏

Web 性能压测工具 ApacheBench(ab)使用总结

对于 web 服务,不管是上新,还是平时产品运营,节假日活动等,在这之前都需要评估现网压力承受能力,提前进行扩容,并做到防患于未然。所以对网站性能压力测试是必不...

2K00
来自专栏大内老A

如何利用ETW(Event Tracing for Windows)记录日志

ETW是Event Tracing for Windows的简称,它是Windows提供的原生的事件跟踪日志系统。由于采用内核(Kernel)层面的缓冲和日志记...

43960
来自专栏Petrichor的专栏

sudo apt-get update 报错

54240
来自专栏猿天地

Spring cloud Zuul Filter 使用小经验

前言 Filter 我们用的比较多,大部分是Servlet中的Filter,通常我们用来做一些拦截,权限验证之类的工作。 今天介绍的Filter是Zuul中提供...

43660
来自专栏晓晨的专栏

C#获取根目录的方法集合

20930

扫码关注云+社区

领取腾讯云代金券