深入理解Spring Cloud Zuul过滤器

 更新时间:2017年02月28日 08:18:01   作者:周立  
这篇文章主要给大家介绍了关于Spring Cloud Zuul过滤器的相关资料,通过阅读本文您将了解:Zuul过滤器类型与请求生命周期、如何编写Zuul过滤器、如何禁用Zuul过滤器和Spring Cloud为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所示,该图详细描述了各种类型的过滤器的执行顺序。

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()

总结

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

相关文章

  • Java MAVEN 工程pom配置报错解决方案

    Java MAVEN 工程pom配置报错解决方案

    这篇文章主要介绍了Java MAVEN 工程pom配置报错解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java设计模块系列之书店管理系统单机版(一)

    Java设计模块系列之书店管理系统单机版(一)

    这篇文章主要为大家详细介绍了Java单机版的书店管理系统设计模块和思想第一章,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Spring中的事务传播行为示例详解

    Spring中的事务传播行为示例详解

    这篇文章主要给大家介绍了关于Spring中事务传播行为的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • 教你用JDK编译Java文件的方法

    教你用JDK编译Java文件的方法

    这篇文章主要介绍了教你用JDK编译Java文件的方法,分步骤给大家介绍了设置环境变量的方法,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • java arrayList遍历的四种方法及Java中ArrayList类的用法

    java arrayList遍历的四种方法及Java中ArrayList类的用法

    arraylist是动态数组,它具有三个好处分别是:动态的增加和减少元素 、实现了ICollection和IList接口、灵活的设置数组的大小,本文给大家介绍java arraylist遍历及Java arraylist 用法,感兴趣的朋友一起学习吧
    2015-11-11
  • java面试常见模式问题---代理模式

    java面试常见模式问题---代理模式

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息
    2021-06-06
  • Java设计模式之适配器模式简介

    Java设计模式之适配器模式简介

    这篇文章主要介绍了Java设计模式之适配器模式,需要的朋友可以参考下
    2014-07-07
  • Java微信公众平台开发(4) 回复消息的分类及实体的创建

    Java微信公众平台开发(4) 回复消息的分类及实体的创建

    这篇文章主要为大家详细介绍了Java微信公众平台开发第四步,回复消息的分类及实体的创建,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 关于Java下奇怪的Base64详解

    关于Java下奇怪的Base64详解

    这篇文章主要给大家介绍了关于Java下奇怪的Base64的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java基于控制台界面实现ATM系统

    Java基于控制台界面实现ATM系统

    这篇文章主要为大家详细介绍了Java基于控制台界面实现ATM系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05

最新评论