Spring Cloud Hystrix 斷路器

本篇文章為Spring Cloud 各模塊演示代碼的分支[Hystrix]部分贱呐。
先從幾個(gè)概念開(kāi)始,了解概念有助于對(duì)Hystrix的理解脯颜。

熔斷虽画、降級(jí)舞蔽、限流的概念

  • 雪崩效應(yīng)
    分布式系統(tǒng)中經(jīng)常會(huì)出現(xiàn)某個(gè)基礎(chǔ)服務(wù)不可用造成整個(gè)系統(tǒng)不可用的情況, 這種現(xiàn)象被稱為服務(wù)雪崩效應(yīng). 為了應(yīng)對(duì)服務(wù)雪崩, 一種常見(jiàn)的做法是手動(dòng)服務(wù)降級(jí).

    • 定義
      雪崩效應(yīng):服務(wù)提供者 的不可用導(dǎo)致 服務(wù)調(diào)用者 的不可用,并將不可用 逐漸放大 的過(guò)程
      下圖從上到下看,可以發(fā)現(xiàn)隨著A不可用码撰,慢慢的B服務(wù)還有CD服務(wù)都不可用了渗柿。

      雪崩效應(yīng)

    • 雪崩效應(yīng)形成的原因
      我把服務(wù)雪崩的參與者簡(jiǎn)化為 服務(wù)提供者 和 服務(wù)調(diào)用者, 并將服務(wù)雪崩產(chǎn)生的過(guò)程分為以下三個(gè)階段來(lái)分析形成的原因:
      1.服務(wù)提供者不可用
      2.重試加大流量
      3.服務(wù)調(diào)用者不可用

    1. 服務(wù)提供者不可用原因
      服務(wù)雪崩的每個(gè)階段都可能由不同的原因造成, 比如造成 服務(wù)不可用的原因有:
      硬件故障: 硬件故障可能為硬件損壞造成的服務(wù)器主機(jī)宕機(jī), 網(wǎng)絡(luò)硬件故障造成的服務(wù)提供者的不可訪問(wèn).
      程序Bug
      緩存擊穿: 緩存擊穿一般發(fā)生在緩存應(yīng)用重啟, 所有緩存被清空時(shí),以及短時(shí)間內(nèi)大量緩存失效時(shí). 大量的緩存不命中, 使請(qǐng)求直擊后端,造成服務(wù)提供者超負(fù)荷運(yùn)行,引起服務(wù)不可用.
      用戶大量請(qǐng)求: 在秒殺和大促開(kāi)始前,如果準(zhǔn)備不充分,用戶發(fā)起大量請(qǐng)求也會(huì)造成服務(wù)提供者的不可用.

    2. 重試加大流量
      用戶重試:在服務(wù)提供者不可用后, 用戶由于忍受不了界面上長(zhǎng)時(shí)間的等待,而不斷刷新頁(yè)面甚至提交表單.
      代碼邏輯重試:服務(wù)調(diào)用端的會(huì)存在大量服務(wù)異常后的重試邏輯.

    3. 服務(wù)調(diào)用者不可用
      當(dāng)服務(wù)調(diào)用者使用 同步調(diào)用 時(shí), 會(huì)產(chǎn)生大量的等待線程占用系統(tǒng)資源. 一旦線程資源被耗盡,服務(wù)調(diào)用者提供的服務(wù)也將處于不可用狀態(tài), 于是服務(wù)雪崩效應(yīng)產(chǎn)生了.

  • 應(yīng)對(duì)策略
    熔斷:通過(guò) 超時(shí)機(jī)制使得不可用服務(wù)的調(diào)用快速失敗
    限流:網(wǎng)關(guān)限流、用戶交互限流灸拍、關(guān)閉重試做祝、接口限流砾省。在JAVA中實(shí)現(xiàn)接口限流可以用guava的RateLimiter鸡岗,它實(shí)現(xiàn)了令牌桶算法和漏桶算法。
    降級(jí):調(diào)用服務(wù)線程池隔離编兄、依賴服務(wù)分類(終止弱依賴服務(wù))
    服務(wù)自動(dòng)擴(kuò)容

以上概念部分摘自 http://kaimingwan.com/post/jia-gou/shi-yong-hystrixwan-cheng-rong-duan-xian-liu-he-jiang-ji

Hystrix 代碼示例

  • 斷路器demo
    1. 啟動(dòng)注冊(cè)中心 eureka-a
    2.啟動(dòng)服務(wù)端 spring-cloud-03-hystrix-client
    3.啟動(dòng)客戶端 spring-cloud-03-hystrix-request-a
    請(qǐng)求超時(shí)觸發(fā)http://localhost:6001/hystrix-hello
    返回:----------執(zhí)行降級(jí)策略------------
      /**
       * 配置的斷路時(shí)間為2秒,但是調(diào)用的服務(wù)睡眠了3秒轩性。進(jìn)入降級(jí)策略
       * @return
       */
      @HystrixCommand(fallbackMethod = "callHelloFailback")
      public String callHello() {
          return restTemplate.getForObject("http://client-service/hello", String.class);
      }
      
      public String callHelloFailback(){
          System.err.println("----------執(zhí)行降級(jí)策略------------");
          return "----------執(zhí)行降級(jí)策略------------";
      }
    
    異常捕捉觸發(fā): http://localhost:6001/hystrix-handler
    返回: 獲取異常信息并可以做具體的降級(jí)處理
    /**
     * 異常捕獲方式的斷路器
     */
    @HystrixCommand(fallbackMethod = "handlerFailback",  ignoreExceptions = {BadRequestException.class})
    public String handler() {
        throw new RuntimeException("運(yùn)行時(shí)異常...");
    }
    
    /**
     * 異常信息可傳遞到fallback方法中
     */
    public String handlerFailback(Throwable e){
        System.err.println("異常信息: " + e.getMessage());
        return "獲取異常信息并可以做具體的降級(jí)處理";
    }
    
    單獨(dú)API配置
      /**
       * 對(duì)單獨(dú)API 配置斷路由規(guī)則,不受配置文件中的配置參數(shù)影響
       * 如下,配置8秒讀取超時(shí),配置文件中的2秒將失效
       * 更多commandProperties信息:https://github.com/Netflix/Hystrix/wiki/Configuration 
       */
      @HystrixCommand(
              commandKey = "hiKey",
              commandProperties = {@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", /*KEY*/ value = "8000" /*VALUE*/)},
              fallbackMethod = "callHiFailback")
      public String callhi() {
                  System.err.println("--客戶端調(diào)用-----");
          return restTemplate.getForObject("http://client-service/hi", String.class);
      }
      
      public String callHiFailback(){
          System.err.println("----------執(zhí)行降級(jí)策略------------");
          return "----------執(zhí)行降級(jí)策略------------";
      }
    

Hystrix DashBoard 服務(wù)壓力查看器

1.在以上的Demo啟動(dòng)的基礎(chǔ)上,啟動(dòng) spring-cloud-03-hystrix-dashboard
2.訪問(wèn) http://localhost:5001/hystrix

DashBoard

3.點(diǎn)擊進(jìn)入后可查看所有的請(qǐng)求情況
監(jiān)控界面

Hystrix Turbine 集群服務(wù)壓力查看器

1.在以上的基礎(chǔ)上啟動(dòng) spring-cloud-03-hystrix-request-b 和 集群收集模塊turbine spring-cloud-03-hystrix-turbine
這時(shí)在dashboard中填入的地址為http://localhost:3000/turbine.stream
點(diǎn)擊監(jiān)控狠鸳。分別請(qǐng)求 spring-cloud-03-hystrix-request-aspring-cloud-03-hystrix-request-b 的API之后揣苏。會(huì)發(fā)現(xiàn)在監(jiān)控平臺(tái)上的Hosts變?yōu)榱?.兩個(gè)客戶端的請(qǐng)求都能被監(jiān)控了悯嗓。


END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市卸察,隨后出現(xiàn)的幾起案子脯厨,更是在濱河造成了極大的恐慌,老刑警劉巖坑质,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件合武,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涡扼,警方通過(guò)查閱死者的電腦和手機(jī)稼跳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)吃沪,“玉大人汤善,你說(shuō)我怎么就攤上這事∑北耄” “怎么了红淡?”我有些...
    開(kāi)封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)降铸。 經(jīng)常有香客問(wèn)我锉屈,道長(zhǎng),這世上最難降的妖魔是什么垮耳? 我笑而不...
    開(kāi)封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任颈渊,我火速辦了婚禮,結(jié)果婚禮上终佛,老公的妹妹穿的比我還像新娘俊嗽。我一直安慰自己,他們只是感情好铃彰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布绍豁。 她就那樣靜靜地躺著,像睡著了一般牙捉。 火紅的嫁衣襯著肌膚如雪竹揍。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天邪铲,我揣著相機(jī)與錄音芬位,去河邊找鬼。 笑死带到,一個(gè)胖子當(dāng)著我的面吹牛昧碉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼被饿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼四康!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起狭握,我...
    開(kāi)封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闪金,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后论颅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體毕泌,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嗅辣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了撼泛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澡谭,死狀恐怖愿题,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛙奖,我是刑警寧澤潘酗,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雁仲,受9級(jí)特大地震影響仔夺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜攒砖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一缸兔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吹艇,春花似錦惰蜜、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鼻听,卻和暖如春财著,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撑碴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工撑教, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人灰羽。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓驮履,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親廉嚼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子玫镐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354