责任链模式实践之Zuul责任链模式
责任链模式实践之Zuul责任链模式
一,什么是责任链模式
责任链(Chain of Responsibility)模式的定义:为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
注意:责任链模式也叫职责链模式。
在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,所以责任链将请求的发送者和请求的处理者解耦了。
二,ZuulFilter
ZuulFilter类是Zuul责任链模式的实现基础。
ZuulFilter是一个抽象类。ZuulFilter实现了IZuulFilter接口、Comparable接口。
继承ZuulFilter的类需要实现下面4个方法:
filterType():过滤器类型,可选值有4个,pre、route、post、error。
filterOrder():过滤器执行的优先级。当某种类型的过滤器有多个时,根据优先级依次执行。
shouldFilter():判断过滤器是否需要执行。可以通过这个方法来限制过滤器的执行条件。
run():过滤器的具体执行逻辑。
三,Zuul责任链模式的实现
Zuul责任链模式的实现和Zookeeper责任链模式的区别还是很大的。
ZuulFilter的实现有很多,这些实现类构成了Zuul的责任链。如何执行呢?
首先,Zuul把过滤器链分成了4类:pre过滤器、route过滤器、post过滤器、error过滤器。这个划分的依据其实就是http请求的流程。ZuulFilter的实现类必须指定是哪种类型的过滤器,也就是filterType。ZuulFilter的实现了还必须指定过滤器的执行顺序,也就是filterOrder。
接着ZuulServlet会依次执行pre过滤器、route过滤器、post过滤器,如果执行过程中出现异常,则执行error过滤器。注意这里的执行顺序:pre过滤器 -> route过滤器 -> post过滤器。
最后ZuulServlet把请求交给ZuulRunner,ZuulRunner再把请求交给FilterProcessor,FilterProcessor会根据类型遍历所有的过滤器,然后循环调用执行。对于同一类型的过滤器而言,filterOrder的值越小,越先执行。
四,责任链模式对比:Zookeeper责任链模式和Zuul责任链模式
在对比二者之前我们先来看看这两者都是做什么的?
Zookeeper责任链模式:处理Zookeeper客户端请求。
Zuul责任链模式:拦截客户端请求并转发给目标微服务。
1,是否解藕
是。Zookeeper责任链模式借助阻塞队列LinkedBlockingQueue来解藕。Zuul责任链模式借助全局上下文RequestContext来解藕。
2,执行顺序
Zookeeper责任链模式的执行顺序必须由上一处理器来指定,Zookeeper指定PrepRequestProcessor为第一个执行的处理器,FinalRequestProcessor为最后一个执行的处理器,所有中间执行的处理器必须由其他处理器来调用。
Zuul责任链模式的执行顺序由filterType和filterOrder共同决定。不同的类型执行顺序为:pre过滤器 -> route过滤器 -> post过滤器。同一类型的执行顺序为:按filterOrder值大小排序,filterOrder值越小,越先执行。
3,扩展性
Zookeeper责任链模式的扩展是有一定的代价的,如果新增一个处理器,必须要改动之前的处理器逻辑,因为新增的这个处理器必须显示的在已有的处理器中调用。并且,Zookeeper责任链模式不支持开发者进行扩展。这个其实也可以理解,毕竟处理客户端请求的逻辑属于Zookeeper框架的内容,对于使用者而言,无须修改。
Zuul责任链模式支持开发者进行扩展,并且还可以禁用Zuul框架提供的某些过滤器。并且这个扩展也很简单,只需要继承ZuulFilter类,实现其中的4个方法即可。这样看来,我们发现Zuul的责任链模式更加简单,更加易于扩展。
其实我们这种对比,没有太大的意义,可能最大的意义就是方便学习,方便记忆。但是我们回到原点,来看看:
它是做什么的?
Zookeeper的出现要早于Spring Cloud,Zookeeper的责任链是为了处理Zookeeper客户端的请求。注意,这里处理的是Zookeeper客户端的请求,是一种CS架构,这种请求不是客户请求,而是服务器请求。所以Zookeeper没有充分的考虑扩展性,因为这不是Zookeeper的主要设计目标。
Zuul的责任链模式其实是处理浏览器请求的,是一种BS架构。Zuul的本质其实就是我们java的filter过滤器,主要是拦截并处理浏览器请求。由于不同的项目对请求的处理差异性较大,比如有的系统对安全性要求较高,所以决定了Zuul要把一部分处理交给开发者,Zuul只实现一些基本的,公共的功能。
设计模式本身并没有那么神奇,滥用设计模式可能适得其反。设计模式只是一剂良药,但是并不是包治百病。清楚要做什么才是根本,设计模式只是一个工具,切勿本末倒置。
用一个设计模式,是因为清楚设计模式的缺点。不用,是因为清楚它的优点。
责任链模式实践之Zuul责任链模式相关推荐
- 2019链塔大会暨亚洲区块链技术与应用论坛盛大召开
2019年6月15日,全球区块链数据及分析服务提供商链塔科技BlockData携手来自亚洲各个地区的合作伙伴,在北京天伦王朝酒店成功举办了"2019链塔大会暨亚洲区块链技术与应用论坛&quo ...
- 设计模式——行为型模式之责任链模式(简简单单入门责任链,理解I/O流消息怎么逐步传递处理以及服务器框架转发)
文章目录 前言 一.责任链模式定义 二.责任链模式结构 三.责任链高级应用 四.责任链模式优缺点 设计模式系列文章 结尾 前言 作者更有一系列设计模式文章(还在持续更新),图例丰富,少量代码,适合入门 ...
- 【设计模式系列19】状态模式原理分析及其和策略模式,责任链模式的区别
状态模式原理分析 设计模式系列总览 前言 什么是状态模式 状态模式示例 状态模式角色 状态模式与责任链模式 状态模式与策略模式 状态模式应用场景 状态模式优缺点 总结 设计模式系列总览 设计模式 飞机 ...
- 西瓜客户端埋点实践:基于责任链的埋点框架
埋点的背景 目前互联网/软件行业内,广泛使用数据驱动产品迭代,通过精细的数据分析.模型训练为用户提供更好的服务.在此过程中,数据埋点的工作是后续数据分析.模型训练等工作的基础. 数据埋点通常是产品经理 ...
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- Spring Cloud微服务网关Zuul过滤链和整合OAuth2+JWT入门实战
一.Spring Cloud Zuul 过滤链 1.1 工作原理 Zuul的核心逻辑是由一系列的Filter来实现的,他们能够在进行HTTP请求或者相应的时候执行相关操作.Zuul Filter的主要 ...
- java23中设计模式——行为模式——Chain of Responsibility(职责链)
2019独角兽企业重金招聘Python工程师标准>>> 角色 抽象处理者角色(Handler):定义出一个处理请求的接口.如果需要,接口可以定义 出一个方法以设定和返回对下家的引用. ...
- 京东区块链技术实践白皮书(附下载地址)
CSDN下载地址:https://download.csdn.net/download/u010144805/10303943 3月22日消息,京东公司(股票代码:JD)今日正式发布区块链方案白皮书, ...
- 新书推荐 |《区块链工程实践:行业解决方案与关键技术》
新书推荐 <区块链工程实践:行业解决方案与关键技术> 点击上图了解及购买 远光软件区块链首席科学家5年项目经验总结,通过5个工程案例给出设计整体解决方案的系统方法,6位专家推荐. 编辑推荐 ...
最新文章
- Python 编写用户登录接口
- Tkinter的Canvas组件
- Win11重磅新功能推送!
- 地铁 java_怎么用Java编写一个地铁售票机的程序?
- [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
- 用计算机弹奏体面6,抖音能用计算器按出音乐有哪些?计算器乐谱分享
- javaweb使用quartz
- 一文读懂「云上企业级存储」
- stm32与绝对式编码器的ssi接口进行通信
- 1206_MISRA_C规范学习笔记_Rule 10.1 Rule 10.2
- rar压缩文件密码破解
- 作业调度框架 Quartz 学习笔记(三) -- Cron表达式 (转载)
- 批处理设置计算机不休眠,Windows 定时休眠 睡眠 批处理命令
- 中国曲谱网爬虫研究(Python)
- epub阅读器 html,打造web版epub阅读器(书架设计)
- RuoYi-Vue——图标使用
- 【汽车制造业】“新三化+新能源”蓝海,加速车企数字化转型进入“深水区”
- 安超云生态 | 安超云与杉岩数据完成产品互兼容认证 携手打造协同生态
- Dubious Document
- 相机光学(十五)——如何提高相机标定的精度