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

深入解析Spring Cloud内置的Zuul过滤器

程序员文章站 2024-03-05 14:52:50
前言 spring cloud默认为zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@enablezuulserver、@enablezuulprox...

前言

spring cloud默认为zuul编写并启用了一些过滤器,这些过滤器有什么作用呢?我们不妨按照@enablezuulserver、@enablezuulproxy两个注解进行展开,相信大家对这两个注解都不陌生(至少都见过吧)。如果觉得陌生也没有关系,可将@enablezuulproxy简单理解为@enablezuulserver的增强版。事实上,当zuul与eureka、ribbon等组件配合使用时,

@enablezuulproxy是我们常用的注解。

在spring cloud的官方文档中,只说@enablezuulserver是一个“空白”的zuul,那么究竟空白在什么地方呢?与@enablezuulproxy到底有什么区别呢?诸多问题,都将在本文找到答案。

在此之前,我们先理解什么是requestcontext:

requestcontext:用于在过滤器之间传递消息。它的数据保存在每个请求的threadlocal中。它用于存储请求路由到哪里、错误、httpservletrequest、httpservletresponse都存储在requestcontext中。requestcontext扩展了concurrenthashmap,所以,任何数据都可以存储在上下文中。

@enablezuulserver过滤器

一、pre类型过滤器

(1) servletdetectionfilter:该过滤器用于检查请求是否通过spring dispatcher。检查后,通过isdispatcherservletrequest设置布尔值。

(2) formbodywrapperfilter:解析表单数据,并为请求重新编码。

(3) debugfilter:顾名思义,调试用的过滤器,可以通过zuul.debug.request=true ,或在请求时,加上debug=true的参数,例如$zuul_host:zuul_port/path?debug=true 开启该过滤器。这样,该过滤器就会把requestcontext.setdebugrouting() requestcontext.setdebugrequest() 设为true。

二、route类型过滤器

sendforwardfilter:该过滤器使用servlet requestdispatcher转发请求,转发位置存储在requestcontext.getcurrentcontext().get("forward.to") 中。可以将路由设置成:

zuul:
 routes:
 abc: 
  path: /abc/**
  url: forward:/abc

然后访问$zuul_host:zuul_port/abc ,观察该过滤器的执行过程。

三、post类型过滤器

sendresponsefilter:将zuul所代理的微服务的的响应写入当前响应。

四、error类型过滤器

senderrorfilter:如果requestcontext.getthrowable() 不为null,那么默认就会转发到/error,也可以设置error.path属性修改默认的转发路径。

@enablezuulproxy过滤器

如果使用注解@enablezuulproxy,那么除上述过滤器之外,spring cloud还会安装以下过滤器:

一、pre类型过滤器

predecorationfilter:该过滤器根据提供的routelocator确定路由到的地址,以及怎样去路由。该路由器也可为后端请求设置各种代理相关的header。

二、route类型过滤器

(1) ribbonroutingfilter:该过滤器使用ribbon,hystrix和可插拔的http客户端发送请求。serviceid在requestcontext.getcurrentcontext().get("serviceid") 中。该过滤器可使用不同的http客户端,例如

  1. apache httpclient:默认的http客户端
  2. squareup okhttpclient v3:如需使用该客户端,需保证com.squareup.okhttp3的依赖在classpath中,并设置ribbon.okhttp.enabled = true
  3. netflix ribbon http client:设置ribbon.restclient.enabled = true 即可启用该http客户端。需要注意的是,该客户端有一定限制,例如不支持patch方法,另外,它有内置的重试机制。

(2) simplehostroutingfilter:该过滤器通过apache httpclient向指定的url发送请求。url在requestcontext.getroutehost() 中。

总结

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