SpringCloud Hystrix 服务降级

什么是Hystrix?

    在分布式环境中,不可避免地会有许多服务依赖项失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止跨服务的级联故障并提供回退选项来实现这一点,所有这些都可以提高系统的总体弹性。


Hystrix是干什么用的?

    1 保护和控制调用第三方客户端库的依赖(通常是通过网络)的延迟和失败。

    2 防止复杂分布式系统中的级联故障。

    3 快速失败和快速恢复。

    4 回退(配置回退方法)并尽可能优雅降级。

    5 启用近实时监视、警报和操作控制。

下面讲述一个级联故障的例子。

    可以看到 App Container服务调用了很多的第三方服务,当服务都可用的情况下没什么问题。

但是当一个依赖的I第三方服务网络调用延时或者服务挂掉的情况下会导致调用方用户线程阻塞。

    在高流量的情况下,单个后端依赖项(dependency I)的潜在影响可能会导致所有服务器(调用方)上的所有资源在几秒钟内饱和。

    应用程序中通过网络或进入客户端库可能导致网络请求的每一点都是潜在故障的根源。比故障更糟糕的是,这些应用程序还会导致服务之间的延迟增加,导致更多的级联故障。

那么豪猪(hystrix)是如何做的呢?

    1 将对外部系统(或“依赖项”)的所有调用包装在HystrixCommand或HystrixObservableCommand对象中,该对象通常在单独的线程中执行(这是命令模式的一个示例)。

     2  超时调用的时间长于您定义的阈值。有一个默认值,但是对于大多数依赖项,您可以通过“属性”自定义设置这些超时,以便它们比每个依赖项的99.5%的性能略高。

     3  为每个依赖项维护一个小的线程池(或信号量);如果它已经满了,针对该依赖项的请求将立即被拒绝,而不是排队。

     4  记录成功、失败(客户端抛出的异常)、超时和线程拒绝。

     5  如果服务的错误百分比超过阈值,可以自动或者手动的断开断路器,以在一段时间内停止对特定服务的所有请求。

     6  在请求失败、被拒绝、超时或短路时执行回退逻辑。

     7 几乎实时地监视度量和配置更改。


    当您使用Hystrix包装每个底层依赖项时,上面图中所示的体系结构将发生变化,将变成下面的图。每个依赖项都是相互隔离的,当延迟发生时,分配给被调用方的资源项(线程池)的资源将会饱和,将会触发断路器并调用预先设定的回调函数,使得不影响调用方,并在当被调用方恢复后会关闭短路器。


下面看看Hystrix的实现逻辑

    

流程如下:

 1  构造一个HystrixCommand或HystrixObservableCommand对象

 2  执行命令

 3 是否缓存了响应

 4 电路打开了吗

5 线程池/队列/信号量是否已满

6 执行HystrixObservableCommand.construct()或HystrixCommand.run()

7 计算电路健康

8 执行回退函数

9 返回成功响应

Circuit Breaker(断路器)逻辑:


电路开闭的条件如下:

1 假设电路的请求音量满足域值 HystrixCommandProperties.circuitBreakerRequestVolumeThreshold()

2 假设误差百分比超过阈值误差百分比 

      HystrixCommandProperties.circuitBreakerErrorThresholdPercentage()

3 断路器从闭合过渡到打开

4. 当它是开着的,它短路了所有对断路器的要求。

5.过了一段时间(HystrixCommandProperties.circuitBreakerSleepWindowInMilliseconds())

短路器处于半开状态,此时允许1个请求通过执行,当请求执行成功,则短路器从打开到闭合,若此时请求还是失败,则继续阻断所有请求。

参考:https://github.com/Netflix/Hystrix/wiki/How-it-Works#flow1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容