深入解析Spring Cloud内置的Zuul过滤器
作者:周立 发布时间:2022-05-16 12:49:04
前言
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()
中。
总结
来源:http://www.itmuch.com/spring-cloud/zuul/zuul-filter-in-spring-cloud/


猜你喜欢
- 最近在鼓捣spring -boot ,真好用,学习到jpa.通过生成Entity 文件,能够快速的生成数据库,并且使用JpaReposito
- 本文实例讲述了Android开发之使用SQLite存储数据的方法。分享给大家供大家参考,具体如下:前面已经说到了几种文件的操作如shared
- 堆的性质堆是一棵完全二叉树,实际中可以通过一个数组来实现,它最重要的一个性质是:任意节点都小于(大于)等于其子节点。将根节点最小的堆称为最小
- 前述园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减少
- Kotlin中StateFlow的使用StateFlow 是 Flow 的实现,是一个特殊的流,默认的 Flow 是冷流,而StateFlo
- 一:简述如果我们想要生成一个随机数,通常会使用Random类。但是在并 * 况下Random生成随机数的性能并不是很理想,今天给大家介绍一下J
- 本篇文章介绍自定义View配合属性动画来实现如下的效果实现思路挺简单:画一个半透明的圆实现两种动画效果,点击时扩散和不点击时扩散回收使用线程
- 目录顶级程序顶级程序中的方法顶级程序中的类顶级程序的原理分析当我们用 C# 进行编码的时候,总需要写很多的模板代码,即使是最简单的 cons
- lombok插件使用引入依赖,在项目中使用Lombok可以减少很多重复代码的书写。比如说getter/setter/toString等方法的
- 本文实例为大家分享了C#实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下之前一直想写一个贪吃蛇小游戏,上个周末终于有时间做了一个,现在和
- 日常开发中,判断邮箱是少不了的,这个我以**C#**为例,来写一个判断方法,正则表达式是通用的,CV就可以首先引入正则需要使用的命名空间//
- 一,“==”与equals()运行以下代码,如何解释其输出结果?public class StringPool { public
- 前言:最近对接了一个第三方的项目,该项目的数据传输格式是XML。由于工作多年只有之前在医疗行业的时候有接触过少量数据格式是XML的接口,之后
- 说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:public class
- 本文实例讲述了Java使用Preference类保存上一次记录的方法。分享给大家供大家参考。具体分析如下:在使用java中JFileChoo
- 下面是自己写的三个方法,直接类名.方法即可调用,注意此处未做异常处理.1.下划线转驼峰 lowerLineToHump()2.首字母大写 c
- 一、WebSocket简介WebSocket协议通过在客户端和服务端之间提供全双工通信来进行Web和服务器的交互功能。在WebSocket应
- 本文实例讲述了Java面向接口编程之简单工厂模式。分享给大家供大家参考,具体如下:一 代码interface Output{ /
- 增加了用于处理MyBatis的两个bean:SqlSessionFactoryBean、MapperFactoryBean1、注册SqlSe
- 前言在最近的一个项目中做了一个涂鸦的效果,手指快速移动,会出现折线,这篇文章记录笔触优化。下面话不多说了,来一起看看详细的介绍吧。优化前优化