最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談一下SpringCloud中Hystrix服務(wù)熔斷和降級(jí)原理

 更新時(shí)間:2023年05月19日 08:59:18   作者:長(zhǎng)安明月  
這篇文章主要介紹了淺談一下SpringCloud中Hystrix服務(wù)熔斷和降級(jí)原理,Hystrix 是 Netflix 的一款開源的容錯(cuò)框架,通過服務(wù)隔離來避免由于依賴延遲、異常,引起資源耗盡導(dǎo)致系統(tǒng)不可用的解決方案,需要的朋友可以參考下

在分布式系統(tǒng)架構(gòu)中,如果一個(gè)應(yīng)用不能對(duì)來自依賴的故障進(jìn)行隔離,那該應(yīng)用本身就處在被拖垮的風(fēng)險(xiǎn)中。 因此,為了構(gòu)建穩(wěn)定、可靠的分布式系統(tǒng),我們的服務(wù)應(yīng)當(dāng)具有自我保護(hù)能力,當(dāng)依賴服務(wù)不可用時(shí),當(dāng)前服務(wù)啟動(dòng)自我保護(hù)功能,從而避免發(fā)生雪崩效應(yīng)。在分布式微服務(wù)系統(tǒng)設(shè)計(jì)時(shí),要使用一定的降級(jí)策略,來保證當(dāng)服務(wù)提供方不可用時(shí),服務(wù)調(diào)用方可以切換到降級(jí)后的策略進(jìn)行處理。Hystrix 作為熔斷器組件,其使用范圍還是很廣泛的。本文簡(jiǎn)單介紹下 Hystrix 的原理。

一、Hystrix 是什么?

Hystrix 是 Netflix 的一款開源的容錯(cuò)框架,通過服務(wù)隔離來避免由于依賴延遲、異常,引起資源耗盡導(dǎo)致系統(tǒng)不可用的解決方案。

二、Hystrix 可以做什么?

Hystrix 被設(shè)計(jì)用來做了下面幾件事:

  1. 保護(hù)系統(tǒng)間的調(diào)用延時(shí)以及錯(cuò)誤,特別是通過第三方工具的網(wǎng)絡(luò)調(diào)用
  2. 阻止錯(cuò)誤在分布式系統(tǒng)之前的傳播
  3. 快速失敗和迅速恢復(fù)
  4. 錯(cuò)誤回退和優(yōu)雅的服務(wù)降級(jí)

三、Hystrix 解決了什么問題?

  1. 限制調(diào)用分布式服務(wù)的資源使用,某一個(gè)調(diào)用的服務(wù)出現(xiàn)問題不會(huì)影響其他服務(wù)調(diào)用,通過線程池隔離和信號(hào)量隔離實(shí)現(xiàn)。
  2. Hystrix 提供了優(yōu)雅降級(jí)機(jī)制:超時(shí)降級(jí)、資源不足時(shí)(線程或信號(hào)量)降級(jí),降級(jí)后可以配合降級(jí)接口返回兜底數(shù)據(jù)。
  3. Hystrix 提供了熔斷器實(shí)現(xiàn),當(dāng)失敗率達(dá)到閥值自動(dòng)觸發(fā)降級(jí)(如因網(wǎng)絡(luò)故障/超時(shí)造成的失敗率高),熔斷器觸發(fā)的快速失敗會(huì)進(jìn)行快速恢復(fù)等。

四、Hystrix遵循的設(shè)計(jì)原則

  1. 防止任何單獨(dú)的依賴耗盡資源(線程)
  2. 過載立即切斷并快速失敗,防止排隊(duì)
  3. 盡可能提供回退以保護(hù)用戶免受故障
  4. 使用隔離技術(shù)(例如隔板,泳道和斷路器模式)來限制任何一個(gè)依賴的影響
  5. 通過近實(shí)時(shí)的指標(biāo),監(jiān)控和告警,確保故障被及時(shí)發(fā)現(xiàn)
  6. 通過動(dòng)態(tài)修改配置屬性,確保故障及時(shí)恢復(fù)
  7. 防止整個(gè)依賴客戶端執(zhí)行失敗,而不僅僅是網(wǎng)絡(luò)通信

五、Hystrix 的工作流程

下圖描述了使用 Hystrix 的一次請(qǐng)求調(diào)用服務(wù)層的流程?!緢D片來源于:Hystrix 官方文檔,點(diǎn)擊看大圖】

在這里插入圖片描述

Hystrix 整個(gè)工作流如下:

  1. 構(gòu)造一個(gè) HystrixCommand 或 HystrixObservableCommand 對(duì)象,用于封裝請(qǐng)求,并在構(gòu)造方法配置請(qǐng)求被執(zhí)行需要的參數(shù);
  2. 執(zhí)行命令,Hystrix提供了多種執(zhí)行命令的方法(詳見本文第六章);
  3. 判斷是否使用緩存響應(yīng)請(qǐng)求,若啟用了緩存,且緩存可用,直接使用緩存響應(yīng)請(qǐng)求。Hystrix 支持請(qǐng)求緩存,但需要用戶自定義啟動(dòng);
  4. 判斷熔斷器是否打開(熔斷器有3種狀態(tài),詳見第七章),如果打開,跳到第8步;
  5. 判斷線程池/隊(duì)列/信號(hào)量是否已滿,已滿則跳到第8步;
  6. 執(zhí)行 HystrixObservableCommand.construct() 或 HystrixCommand.run(),如果執(zhí)行失敗或者超時(shí),跳到第8步;否則,跳到第9步;
  7. 統(tǒng)計(jì)熔斷器監(jiān)控指標(biāo);
  8. 走Fallback備用邏輯;
  9. 返回請(qǐng)求響應(yīng)。從流程圖上可知道,第5步線程池/隊(duì)列/信號(hào)量已滿時(shí),還會(huì)執(zhí)行第7步邏輯,更新熔斷器統(tǒng)計(jì)信息,而第6步無論成功與否,都會(huì)更新熔斷器統(tǒng)計(jì)信息。

六、Hystrix 執(zhí)行命令的幾種方法

Hystrix 提供了4種執(zhí)行命令的方法,execute() 和 queue() 適用于 HystrixCommand 對(duì)象,而 observe() 和toObservable() 適用于 HystrixObservableCommand 對(duì)象。

execute() 以同步堵塞方式執(zhí)行 run(),只支持接收一個(gè)值對(duì)象。Hystrix 會(huì)從線程池中取一個(gè)線程來執(zhí)行 run(),并等待返回值。

queue() 以異步非阻塞方式執(zhí)行 run(),只支持接收一個(gè)值對(duì)象。調(diào)用 queue() 就直接返回一個(gè) Future 對(duì)象??赏ㄟ^ Future.get() 拿到 run() 的返回結(jié)果,但 Future.get() 是阻塞執(zhí)行的。若執(zhí)行成功,F(xiàn)uture.get() 返回單個(gè)值。當(dāng)執(zhí)行失敗時(shí),如果沒有重寫 fallback,F(xiàn)uture.get() 拋出異常。

observe() 事件注冊(cè)前執(zhí)行 run() / construct(),支持接收多個(gè)值對(duì)象,取決于發(fā)射源。調(diào)用 observe() 會(huì)返回一個(gè) hot Observable,也就是說,調(diào)用 observe() 自動(dòng)觸發(fā)執(zhí)行 run() / construct(),無論是否存在訂閱者。

如果繼承的是 HystrixCommand,Hystrix 會(huì)從線程池中取一個(gè)線程以非阻塞方式執(zhí)行 run();如果繼承的是HystrixObservableCommand,將以調(diào)用線程阻塞執(zhí)行 construct()。

observe() 使用方法:

  1. 調(diào)用 observe() 會(huì)返回一個(gè) Observable 對(duì)象;
  2. 調(diào)用這個(gè) Observable 對(duì)象的 subscribe() 方法完成事件注冊(cè),從而獲取結(jié)果。

toObservable() 事件注冊(cè)后執(zhí)行 run() / construct(),支持接收多個(gè)值對(duì)象,取決于發(fā)射源。調(diào)用 toObservable() 會(huì)返回一個(gè) cold Observable,也就是說,調(diào)用 toObservable() 不會(huì)立即觸發(fā)執(zhí)行 run() / construct(),必須有訂閱者訂閱 Observable 時(shí)才會(huì)執(zhí)行。

如果繼承的是 HystrixCommand,Hystrix 會(huì)從線程池中取一個(gè)線程以非阻塞方式執(zhí)行 run(),調(diào)用線程不必等待run();如果繼承的是 HystrixObservableCommand,將以調(diào)用線程堵塞執(zhí)行 construct(),調(diào)用線程需等待construct() 執(zhí)行完才能繼續(xù)往下走。

toObservable() 使用方法:

  1. 調(diào)用 observe() 會(huì)返回一個(gè)Observable對(duì)象;
  2. 調(diào)用這個(gè) Observable 對(duì)象的 subscribe() 方法完成事件注冊(cè),從而獲取結(jié)果。

需注意的是,HystrixCommand 也支持 toObservable() 和 observe(),但是即使將 HystrixCommand 轉(zhuǎn)換成Observable,它也只能發(fā)射一個(gè)值對(duì)象。只有 HystrixObservableCommand 才支持發(fā)射多個(gè)值對(duì)象。

七、熔斷器的三種狀態(tài)

Hystrix 提供的熔斷器具有自我反饋,自我恢復(fù)的功能,Hystrix會(huì)根據(jù)調(diào)用接口的情況,讓熔斷器在closed,open,half-open 三種狀態(tài)之間自動(dòng)切換。

  • open 狀態(tài):說明打開熔斷,也就是服務(wù)調(diào)用方執(zhí)行本地降級(jí)策略,不進(jìn)行遠(yuǎn)程調(diào)用。
  • closed 狀態(tài):說明關(guān)閉了熔斷,這時(shí)候服務(wù)調(diào)用方直接發(fā)起遠(yuǎn)程調(diào)用。
  • half-open 狀態(tài):是一個(gè)中間狀態(tài),當(dāng)熔斷器處于這種狀態(tài)時(shí),直接發(fā)起遠(yuǎn)程調(diào)用。

三種狀態(tài)的轉(zhuǎn)換:

closed → open:正常情況下熔斷器為 closed 狀態(tài),當(dāng)訪問同一個(gè)接口次數(shù)超過設(shè)定閾值并且錯(cuò)誤比例超過設(shè)置錯(cuò)誤閾值的時(shí)候,就會(huì)打開熔斷機(jī)制,這時(shí)候熔斷器狀態(tài)從 closed → open。

open → half-open:當(dāng)服務(wù)接口對(duì)應(yīng)的熔斷器狀態(tài)為 open 狀態(tài)時(shí)候,所有服務(wù)調(diào)用方調(diào)用該服務(wù)方法時(shí)候都是執(zhí)行本地降級(jí)方法,那么什么時(shí)候才會(huì)恢復(fù)到遠(yuǎn)程調(diào)用呢?Hystrix 提供了一種測(cè)試策略,也就是設(shè)置了一個(gè)時(shí)間窗口,從熔斷器狀態(tài)變?yōu)?open 狀態(tài)開始的一個(gè)時(shí)間窗口內(nèi),調(diào)用該服務(wù)接口時(shí)候都委托服務(wù)降級(jí)方法進(jìn)行執(zhí)行。如果時(shí)間超過了時(shí)間窗口,則把熔斷狀態(tài)從 open → half-open,這時(shí)候服務(wù)調(diào)用方調(diào)用服務(wù)接口時(shí),就可以發(fā)起遠(yuǎn)程調(diào)用而不再使用本地降級(jí)接口,如果發(fā)起遠(yuǎn)程調(diào)用還是失敗,則重新設(shè)置熔斷器狀態(tài)為open狀態(tài),從新記錄時(shí)間窗口開始時(shí)間。

half-open → closed:當(dāng)熔斷器狀態(tài)為 half-open,這時(shí)候服務(wù)調(diào)用方調(diào)用服務(wù)接口時(shí)候,就可以發(fā)起遠(yuǎn)程調(diào)用而不再使用本地降級(jí)接口,如果發(fā)起遠(yuǎn)程調(diào)用成功,則重新設(shè)置熔斷器狀態(tài)為 closed 狀態(tài)。

用來判斷熔斷器從 closed → open 轉(zhuǎn)換的數(shù)據(jù)是 HystrixCommandMetrics 對(duì)象來做的,該對(duì)象用來存HystrixCommand 的一些指標(biāo)數(shù)據(jù),比如接口調(diào)用次數(shù),調(diào)用接口失敗的次數(shù)等等。

八、Hystrix 幾種容錯(cuò)方案

  • 隔離模式(線程池隔離、信號(hào)量隔離)
    對(duì)不同類型的請(qǐng)求使用線程池來資源隔離,每種類型的請(qǐng)求互不影響,如果一種類型的請(qǐng)求線程資源耗盡,則對(duì)后續(xù)的該類型請(qǐng)求直接返回,不再調(diào)用后續(xù)資源。
  • 熔斷模式
    如果某個(gè)目標(biāo)服務(wù)調(diào)用慢或者有大量超時(shí),此時(shí),熔斷該服務(wù)的調(diào)用,對(duì)于后續(xù)調(diào)用請(qǐng)求,不再繼續(xù)調(diào)用目標(biāo)服務(wù),而是調(diào)用降級(jí)服務(wù)返回?cái)?shù)據(jù),快速釋放資源。如果目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。
  • 限流模式
    上述的熔斷模式和隔離模式都屬于出錯(cuò)后的容錯(cuò)處理機(jī)制,而限流模式則可以稱為預(yù)防模式。限流模式主要是提前對(duì)各個(gè)類型的請(qǐng)求設(shè)置最高的QPS閾值,若高于設(shè)置的閾值則對(duì)該請(qǐng)求直接返回,不再調(diào)用后續(xù)資源。這種模式不能解決服務(wù)依賴的問題,只能解決系統(tǒng)整體資源分配問題,因?yàn)闆]有被限流的請(qǐng)求依然有可能造成雪崩效應(yīng)。

隔離模式一般使用兩種:

  • 線程池隔離模式
    使用一個(gè)線程池來存儲(chǔ)當(dāng)前的請(qǐng)求,線程池對(duì)請(qǐng)求作處理,設(shè)置任務(wù)返回處理超時(shí)時(shí)間,堆積的請(qǐng)求堆積入線程池隊(duì)列。這種方式需要為每個(gè)依賴的服務(wù)申請(qǐng)線程池,有一定的資源消耗,好處是可以應(yīng)對(duì)突發(fā)流量(流量洪峰來臨時(shí),處理不完可將數(shù)據(jù)存儲(chǔ)到線程池隊(duì)列慢慢處理)。
  • 信號(hào)量隔離模式
    使用一個(gè)原子計(jì)數(shù)器(或信號(hào)量)來記錄當(dāng)前有多少個(gè)線程在運(yùn)行,請(qǐng)求來了的話,先判斷計(jì)數(shù)器的數(shù)值,若超過設(shè)置的最大數(shù)值則丟棄該類型的新請(qǐng)求,若不超過則執(zhí)行計(jì)數(shù)操作請(qǐng)求,使計(jì)數(shù)器 +1,請(qǐng)求返回則計(jì)數(shù)器 -1。這種方式是嚴(yán)格的控制線程且立即返回模式,無法應(yīng)對(duì)突發(fā)流量(流量洪峰來臨時(shí),處理的線程超過數(shù)量,其他的請(qǐng)求會(huì)直接返回,不繼續(xù)去請(qǐng)求依賴的服務(wù))。

到此這篇關(guān)于淺談一下SpringCloud中Hystrix服務(wù)熔斷和降級(jí)原理的文章就介紹到這了,更多相關(guān)Hystrix服務(wù)熔斷和降級(jí)原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一鍵打包壓縮,Java項(xiàng)目變身JAR

    一鍵打包壓縮,Java項(xiàng)目變身JAR

    想要一鍵打包Java項(xiàng)目生成JAR文件并進(jìn)行壓縮?本指南將帶你輕松駕馭這項(xiàng)看似復(fù)雜的任務(wù),讓我們一起揭開神秘的面紗,輕松打包,高效出發(fā)!
    2023-12-12
  • 利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能

    利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能

    這篇文章主要為大家詳細(xì)介紹了利用SpringMVC和Ajax實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • java的Arrays工具類實(shí)戰(zhàn)

    java的Arrays工具類實(shí)戰(zhàn)

    java.util.Arrays類能方便地操作數(shù)組,它提供的所有方法都是靜態(tài)的。Arrays作為一個(gè)工具類,能很好的操作數(shù)組。下面介紹主要使用的幾個(gè)函數(shù)
    2016-12-12
  • 詳解如何使用maven生成可以執(zhí)行的jar

    詳解如何使用maven生成可以執(zhí)行的jar

    這篇文章主要介紹了詳解如何使用maven生成可以執(zhí)行的jar,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Spring中的后置處理器BeanPostProcessor詳解

    Spring中的后置處理器BeanPostProcessor詳解

    這篇文章主要介紹了Spring中的后置處理器BeanPostProcessor詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • java錯(cuò)誤:無效的源發(fā)行版:18解決辦法圖文詳解

    java錯(cuò)誤:無效的源發(fā)行版:18解決辦法圖文詳解

    在Java開發(fā)中,如果你遇到錯(cuò)誤: 無效的源發(fā)行版,這通常意味著你正在使用的Java編譯器(通常是javac)被配置為編譯一個(gè)比你的JDK 版本更高,這篇文章主要給大家介紹了關(guān)于java錯(cuò)誤:無效的源發(fā)行版:18的解決辦法,需要的朋友可以參考下
    2024-08-08
  • 精通Java List 按字段提取對(duì)象

    精通Java List 按字段提取對(duì)象

    這篇文章主要介紹了精通Java List 按字段提取對(duì)象的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 在java中獲取List集合中最大的日期時(shí)間操作

    在java中獲取List集合中最大的日期時(shí)間操作

    這篇文章主要介紹了在java中獲取List集合中最大的日期時(shí)間操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring注解配置實(shí)現(xiàn)過程詳解

    Spring注解配置實(shí)現(xiàn)過程詳解

    這篇文章主要介紹了Spring注解配置實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Nacos源碼閱讀方法

    Nacos源碼閱讀方法

    這篇文章將會(huì)帶大家閱讀Nacos源碼以及教大家閱讀源碼的技巧,感興趣的朋友跟隨小編一起看看Nacos源碼閱讀方法
    2022-03-03

最新評(píng)論

平昌县| 太康县| 吉林省| 马龙县| 上饶市| 呈贡县| 江永县| 道孚县| 广元市| 桐乡市| 宝山区| 康平县| 洮南市| 平罗县| 天柱县| 花垣县| 兴山县| 上虞市| 鄂伦春自治旗| 章丘市| 云霄县| 张家港市| 滨海县| 同德县| 宜昌市| 邯郸县| 休宁县| 美姑县| 河北区| 齐齐哈尔市| 丰镇市| 龙陵县| 巧家县| 苏州市| 广昌县| 健康| 合肥市| 南投县| 朝阳市| 年辖:市辖区| 罗甸县|