一文入門分佈式服務高容錯優雅解決利器 Hystrix

在一個複雜的分佈式應用中,必定會存在很是多的依賴,每個依賴不可避免的總會存在調用失敗的狀況java

如上圖所示,倘若依賴I出現問題,用戶的請求失敗。另外在高併發的場景下,不只僅是服務調用失敗,更有可能致使隊列、線程等等其餘系統資源被佔用,進而引起級聯錯誤git

更要命的是若是依賴I是一個非核心業務,其他的是核心的,這種阻塞是不值當的github

hystrix的目標

  • 對須要調用依賴服務而產生的失敗和時延作控制,保護鏈路
  • 阻止複雜分佈式系統中級聯錯誤的產生
  • 可以快速失敗(好比超時設置)同時迅速從錯誤中恢復
  • 可降級的時候,優雅的執行降級方法
  • 可以作實時監控、提醒和選擇性的控制

hystrix 使用方式

  1. 新建1個本身的「命令類」,它繼承 HystrixCommand,用來「包裝」最終要掉依賴的方法
    class DefaultSettingCommand extends HystrixCommand<String>
    複製代碼
  2. DefaultSettingCommand 中實現 hystrix 的聲明週期的一些方法,包括當前命令的配置、指定run方法以及fallback方法
    • 配置:主要包括兩大塊線程池配置和命令執行的配置 。配置信息詳解戳這裏
      //構造函數中指定配置,線程池包括最大線程數等,命令配置包括超時時間等
       super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("defaultCommand"))
          .andCommandPropertiesDefaults(Setting.DEFAULT_PROPERTIES_SETTER)
          .andThreadPoolPropertiesDefaults(Setting.DEFAULT_THREAD_SETTER));
      複製代碼
    • run方法:指定要執行遠程調用的方法
    • fallback:當run執行失敗或者達到用戶本身配置的狀況,須要執行的備選方法
  3. 在目標方法執行的地方,改成每次使用新建的命令來執行
    //logicService即本來打算要執行的方法,在這裏word是logicService執行方法時的參數
    DefaultSettingCommand defaultCommand = new DefaultSettingCommand(logicService,word);
            defaultCommand.execute();
    複製代碼

繼承HystrixCommand完整可執行的實例請戳這裏web

另外一種使用 Hystrix 的方式是繼承 HystrixObservableCommand ,不過使用它以前須要對 rxjava1 略微瞭解,HystrixObservableCommand感興趣的同窗能夠戳這裏緩存

怎麼對Hystrix作監控

  1. 使用HystrixDashboardStream。HystrixDashboardStream的實現就是按必定的時間間隔固定的去輪詢全部本身存儲的指標,用戶能夠選擇本身感興趣的數據作持久化bash

    它實際上就是單機版的 hystrix-dashboard(hystrix自帶的帶圖形化的架空) 的實現原理,只是沒法作持久化,只能看實時的結果,感興趣的同窗能夠先啓動hystrix-dashboard 查看結果,而後再啓動這個web服務,啓動後按照web服務項目的README便可看到對應圖形界面 。特別注意若是要使用它記得要本身作鑑權,官方說明戳這裏 併發

  2. 利用Hystrix的Publisher機制,將本身實現的Publisher註冊到HyStrix的插件中。publisher可運行實例戳這裏分佈式

hystrix 實現原理

hystrix的業務邏輯以下函數

  • 圖中藍色的實線表示調用路徑
  • 藍色的虛線表示實際調用的方法
  • 紅色的實線表示返回的路徑
  • 紅色的虛線表示每次命令執行結果的數據蒐集

大體邏輯爲以下高併發

  1. 調用HystrixCommand的方法,好比 execute()
  2. hystrix判斷是否用了緩存,緩存命中就直接從緩存返回
  3. 根據以前蒐集的指標,來判斷斷路器(circuit-breaker)是否開啓,若是開啓執行備用方法
  4. 斷路器正常判斷線程池是否發出拒絕信號,是就執行備用方法
  5. 執行用戶自定義的方法
  6. 判斷執行是否成功、是否超時。有問題就執行備用方法,不然正常返回

observe與toObservable

Observer是觀察者,Observable代表是能夠被觀察的。

行人過紅綠燈,行人是Observer,紅綠燈的變化是能夠Observable的。

toObservable就是將執行依賴方法轉變成能夠觀察的,方便Hystrix這個Observer實現本身的業務邏輯

hystrix(1.5.x)底層是使用 rxjava1 實現的,感興趣同窗能夠看下這個RxJava學習路徑

circuit-breaker與short-circuit與fallback

想象一下大學寢室的電路(circuit),正在用個大功率的電磁爐煮火鍋, 正常狀況下,整個電路工做正常,可是因爲使用了大功率電磁爐形成了短路(short-circuit),整個寢室的電路都廢了,這個時候就須要執行備用(fallback)的計劃了,好比打開手機拾到拾到出去吃。運氣好電路沒有短路,可是看到了電線蹦火星,趕忙去把電閘給關了,主動斷開電路,這個關電閘的人就是 circuit-breaker。

如何決定要執行短路邏輯的?

Hystrix是根據RxJava1實現的,看源碼前強烈建議看下這個RxJava學習路徑

以HealthCounts計算爲例。Hystrix底層依賴RxJava,經過RxJava的語義,實現將一個個的命令執行結果分紅桶存儲,而後每一個桶又經過時間窗口的聚合,算出錯誤佔比,而後在每次執行前判斷錯誤佔比是不是繼續執行用戶的 run/constructor方法仍是 執行 getFallBack。源碼跟蹤戳這裏,看源碼過程當中出現的用法能夠在這裏找到單獨案例

附錄

什麼是Hystrix
Hystrix怎麼用
Hystrix的原理
Hystrix的配置

相關文章
相關標籤/搜索