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

发布时间 - 2026-01-10 23:16:40    点击率:

前言

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

总结

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


# spring  # zuul  # 过滤器  # cloud  # spring cloud zuul增加header传输的操作  # spring cloud gateway全局过滤器实现向request header中放数据  # springboot webflux 过滤器(使用RouterFunction实  # SpringCloud Webflux过滤器增加header传递方式  # 客户端  # 的是  # 是一个  # 有什么  # 就会  # 都不  # 也没  # 将在  # 在此  # 还会  # 见过  # 设为  # 有一定  # 这两个  # 可以通过  # 不支持  # 不为  # 什么地方  # 顾名思义  # 会把 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  利用vue写todolist单页应用  如何用虚拟主机快速搭建网站?详细步骤解析  Laravel Docker环境搭建教程_Laravel Sail使用指南  javascript中闭包概念与用法深入理解  清除minerd进程的简单方法  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何在IIS中新建站点并配置端口与IP地址?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  深圳防火门网站制作公司,深圳中天明防火门怎么编码?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  JavaScript如何实现路由_前端路由原理是什么  详解vue.js组件化开发实践  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  网页设计与网站制作内容,怎样注册网站?  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  JS弹性运动实现方法分析  如何在云主机上快速搭建网站?  制作企业网站建设方案,怎样建设一个公司网站?  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  Python文件流缓冲机制_IO性能解析【教程】  如何快速生成ASP一键建站模板并优化安全性?  ,在苏州找工作,上哪个网站比较好?  linux top下的 minerd 木马清除方法  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  如何在新浪SAE免费搭建个人博客?  浅析上传头像示例及其注意事项  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  EditPlus中的正则表达式 实战(4)  如何在Ubuntu系统下快速搭建WordPress个人网站?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  Swift中swift中的switch 语句  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel如何创建自定义中间件?(Middleware代码示例)  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Java类加载基本过程详细介绍  香港服务器网站卡顿?如何解决网络延迟与负载问题?  如何快速上传自定义模板至建站之星?  如何快速查询网站的真实建站时间?  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧