深入解析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")中。可以将路由设置成:
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客户端,例如
- Apache HttpClient:默认的HTTP客户端
- Squareup OkHttpClient 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()中。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
您可能感兴趣的文章:
- 深入解析Python的Tornado框架中内置的模板引擎
- Spring Cloud学习--服务网关(Zuul 过滤器)
- Spring Cloud 的 Zuul 过滤器
- 深入理解Zuul之源码解析
- 深入理解Zuul之源码解析
- spring cloud 使用 Zuul实现过滤器
- Spring Cloud源码解析之如何集成Zuul
- 深入解析Python的Tornado框架中内置的模板引擎
- Spring Cloud (十三) Zuul:静态路由、静态过滤器与动态路由的实现
- 深入理解Zuul之源码解析
- 深入理解Zuul之源码解析(转载)
- 深入解析Java的Servlet过滤器的原理及其应用
- 深入解析Apache Mina源码(1)——Mina的过滤器机制实现
- java 利用POI 上传解析导出Excel 深入
- spring cloud-zuul
- sql server性能调优 I/O开销的深入解析
- Spring技术内幕——深入解析Spring架构与设计原理(一)IOC实现原理
- 深入解析CSS样式层叠权重值
- TimePicker组件的深入解析
- Spring Cloud构建微服务架构—服务网关过滤器