Hystrix实现原理
在了解hystrix的工作原理之前,我们先来了解一下命令模式
命令模式
命令模式的定义: 将请求封装成一个对象,从而让用户使用不同的请求把客户端参数化,以及支持可撤销和恢复的功能。
命令模式常用的对象
Command:请求封装成的对象,该对象是命令模式的主角。也就是说将请求方法封装成一个命令对象,通过操作命令对象来操作请求方法。在命令模式是有若干个请求的,需要将这些请求封装成一条条命令对象,客户端只需要调用不同的命令就可以达到将请求参数化的目的。将一条条请求封装成一条条命定对象之后,客户端发起的就是一个个命令对象了,而不是原来的请求方法!
Receiver:有命令,当然有命令的接收者对象:如果有只有命令,没有接受者,那不就是光棍司令了?没有电视机或者电脑主机,你对着电视机遥控器或者电脑键盘狂按有毛用?Receiver对象的主要作用就是受到命令后执行对应的操作。对于点击遥控器发起的命令来说,电视机就是这个Receiver对象,比如按了待机键,电视机收到命令后就执行了待机操作,进入待机状态。
Client: 但是有一个问题摆在眼前,命令对象现在已经有了,但是谁来负责创建命令呢?这里就引出了客户端Client对象,再命令模式中命令是有客户端来创建的。打个比方来说,操作遥控器的那个人,就是扮演的客户端的角色。人按下遥控器的不同按键,来创建一条条命令。
Invoker:现在创建命令的对象Client也已经露脸了,它负责创建一条条命令,那么谁来使用或者调度这个命令呢?--命令的使用者就是Invoker对象了,还是拿人,遥控器,电视机来做比喻,遥控器就是这个Invoker对象,遥控器负责使用客户端创建的命令对象。该Invoker对象负责要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。
在下面这些情况下应考虑使用命令模式。
• 使用命令模式作为 “ 回调(CallBack) "在面向对象系统中的替代。"CallBack"讲的
便是先将 一个函数登记上, 然后在以后调用此函数。
• 需要在不同的时间指定请求、 将请求排队。 一个命令对象和原先的请求发出者可以
有不同的生命期。 换言之, 原先的请求发出者可能已经不在了, 而命令对象本身仍
然是活动的。这时命令的接收者可以是在本地, 也可以在网络的另外一个地址。命
令对象可以在序列化之后传送到另外一台机器上去。
• 系统需要支持命令的撤销。命令对象可以把状态存储起来, 等到 客户端需要撤销命
令所产生的效果时, 可以调用undo()方法, 把命令所产生的效果撤销掉。命令对
象还可以提供redo()方法, 以供客户端在需要时再重新实施命令效果。
• 如果要将系统中所有的数据更新到日志里,以便在系统 崩溃时,可以根据日志读回
所有的数据更新命令, 重新 调用 Execute()方法 一条一条执行 这些命令, 从而恢
复系统在崩溃前所做的数据更新。
Netflix hystrix工作流程图
上图摘自官网:
https://raw.githubusercontent.com/wiki/Netflix/Hystrix/images/hystrix-command-flow-chart.png