深入解析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客户端,例如
- 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() 中。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# 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列操作与查询技巧

