深入解析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客户端,例如

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

总结

来源:http://www.itmuch.com/spring-cloud/zuul/zuul-filter-in-spring-cloud/

标签:spring,Cloud,zuul过滤器
0
投稿

猜你喜欢

  • Java获取环境变量(System.getenv)的方法

    2021-10-06 03:23:47
  • Eclipse下基于Java的OpenCV开发环境配置教程

    2022-01-30 21:02:54
  • Java使用Log4j记录日志的方法详解

    2022-09-19 01:09:50
  • 解决CollectionUtils.isNotEmpty()不存在的问题

    2021-11-15 12:03:17
  • java关于string最常出现的面试题整理

    2021-10-08 01:12:45
  • jdk动态代理源码分析过程

    2023-03-01 05:05:59
  • springboot 在idea中实现热部署的方法

    2022-10-24 22:27:19
  • Maven构建时跳过部分测试的实例

    2022-08-30 03:42:50
  • Springboot中加入druid连接池

    2023-08-08 05:47:22
  • Unity UGUI实现简单拖拽图片功能

    2022-11-26 19:55:03
  • Springboot Mybatis Plus自动生成工具类详解代码

    2022-09-17 12:01:57
  • Android 调用系统照相机拍照和录像

    2023-10-30 05:40:35
  • 解决Android手机屏幕横竖屏切换

    2022-10-21 18:55:33
  • 详解Java变量与常量

    2023-11-09 21:00:14
  • Unity3D快速入门教程

    2022-04-03 14:11:14
  • Mybatis-Plus-AutoGenerator 最详细使用方法

    2021-06-11 07:45:13
  • SpringBoot程序的打包与运行的实现

    2023-11-29 15:51:27
  • java中String、StringBuffer与StringBuilder的区别

    2021-11-12 13:28:24
  • Android IPC机制利用Messenger实现跨进程通信

    2023-01-02 10:57:49
  • 流读取导致StringBuilder.toString()乱码的问题及解决

    2022-12-20 13:34:14
  • asp之家 软件编程 m.aspxhome.com