欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深入理解Spring Cloud Zuul过滤器

程序员文章站 2024-03-05 13:55:42
前言 过滤器是zuul的核心组件,这篇文章我们来详细讨论zuul的过滤器。下面话不多说,来看看详细的介绍吧。 过滤器类型与请求生命周期 zuul大部分功能都是通过过滤...

前言

过滤器是zuul的核心组件,这篇文章我们来详细讨论zuul的过滤器。下面话不多说,来看看详细的介绍吧。

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

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

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

(2) routing:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用apache httpclient或netfilx ribbon请求微服务。

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

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

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

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

深入理解Spring Cloud Zuul过滤器

zuul请求的生命周期

编写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需实现以下几个方法:

  1. filtertype:返回过滤器的类型。有pre、route、post、error等几种取值,分别对应上文的几种过滤器。详细可以参考com.netflix.zuul.zuulfilter.filtertype() 中的注释。
  2. filterorder:返回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字。
  3. shouldfilter:返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
  4. run:过滤器的具体逻辑。本例中,我们让它打印了请求的http方法以及请求的地址。

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

@bean
public 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()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。