Spring Cloud内置的Zuul过滤器详解

云计算
我是51CTO学院讲师周立,在51CTO学院“4.20 IT充电节”(4月19~20日)到来之际,和大家分享一下《Spring Cloud内置的Zuul过滤器应用》的经验。

[[188309]]

我是51CTO学院讲师周立,在51CTO学院“4.20 IT充电节”(4月19~20日)到来之际,和大家分享一下《Spring Cloud内置的Zuul过滤器应用》的经验。正文来啦~~~

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")中。可以将路由设置成:

  1. zuul: 
  2. routes: 
  3. abc:  
  4. path: /abc/** 
  5. 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客户端,例如

Apache HttpClient:默认的HTTP客户端

SquareupOkHttpClient v3:如需使用该客户端,需保证com.squareup.okhttp3的依赖在classpath中,并设置ribbon.okhttp.enabled = true。

Netflix Ribbon HTTP client:设置ribbon.restclient.enabled = true即可启用该HTTP客户端。需要注意的是,该客户端有一定限制,例如不支持PATCH方法,另外,它有内置的重试机制。

(2) SimpleHostRoutingFilter:该过滤器通过Apache HttpClient向指定的URL发送请求。URL在RequestContext.getRouteHost()中。

51CTO学院 4.20 IT充电节

(19-20号两天,100门视频课程免单抢,更有视频课程会员享6折,非会员享7折,套餐折上8折,微职位立减2000元钜惠)

活动链接:http://edu.51cto.com/activity/lists/id-47.html?wenzhang

相关视频教程:

Spring Cloud微服务实战

http://edu.51cto.com/course/course_id-7348.html 

责任编辑:庞桂玉 来源: 51CTO.com
相关推荐

2021-01-14 08:13:39

Spring Clou应用内置过滤器

2017-05-04 22:30:17

Zuul过滤器微服务

2023-01-26 01:41:27

核心全局过滤器

2022-05-13 08:23:07

Zuul微服务Zuul过滤器

2022-02-21 23:58:49

Spring过滤器顺序值

2023-04-14 09:01:25

2009-07-08 16:07:04

Servlet过滤器配

2011-06-29 16:14:59

Qt 事件 过滤器

2023-07-24 08:00:56

客户端访问指定

2016-12-07 09:56:13

JavaFilter过滤器

2017-09-15 23:29:53

Spring Clou微服务架构过滤器

2021-07-05 15:22:03

Servlet过滤器客户端

2024-01-05 09:04:35

隆过滤器数据结构哈希函数

2009-06-18 10:13:00

Hibernate过滤

2009-07-08 17:33:37

Servlet过滤器

2022-02-16 23:58:41

Spring过滤器验证码

2009-07-08 15:30:56

Servlet过滤器

2009-09-29 13:55:23

Hibernate设置

2009-07-14 09:09:08

Swing模型过滤器

2022-02-14 07:32:13

Spring过滤器链Matcher
点赞
收藏

51CTO技术栈公众号