soul從入門到放棄11--淺入淺出Hystrix插件

一、前戲

Hystrix插件式對netflix.hystrix的一次封裝柳弄,簡單介紹下Hystrix

  • 在2018年11月20日netflix已經(jīng)停止了對其維護(soul內(nèi)目前版本1.5.12)
  • 目前市面大多數(shù)spring cloud項目,熔斷與降級組件使用的依舊是Hystrix
  • 主要包括命令執(zhí)行(execution)配置概说、命令降級(fallback)配置碧注、熔斷器(circuit breaker)配置、度量統(tǒng)計(metrics)配置和請求上下文配置糖赔。
  • 具有信號量模式與線程池模式

科普貼:http://www.reibang.com/p/dc0410558fc9

https://cloud.tencent.com/developer/article/1650056

二萍丐、soul-admin配置

  • 開啟插件

運行Soul-admin,進入管理界面:系統(tǒng)管理 --> 插件管理 --> Hystrix 放典,點擊編輯逝变,把它開啟

配置選擇器選擇器參照divide的匹配方式,讓符合條件的http的請求奋构,能被捕獲到

image.png
  • 配置規(guī)則

以下配置只是為了更容易出現(xiàn)測試效果壳影,生產(chǎn)環(huán)境請勿模仿

image.png

失敗降級URL在后面的測試中弥臼,測試失敗宴咧,應(yīng)該是根據(jù)請求格式有關(guān)。

個別配置項解釋:

  • 命令key:

HystrixCommandKey是Hystrix命令的唯一標識醋火,準確來說是HystrixCommand實例或者HystrixObservableCommand實例的唯一標識悠汽。一般設(shè)置為具體的 路徑接口

  • 分組key:

HystrixCommandGroupKey是用于對Hystrix命令進行分組,分組之后便于統(tǒng)計展示于儀表盤芥驳、上傳報告和預(yù)警等等柿冲,也就是說,HystrixCommandGroupKey是Hystrix內(nèi)部進行度量統(tǒng)計時候的分組標識兆旬,數(shù)據(jù)上報和統(tǒng)計的最小維度就是分組的KEY假抄。 一般設(shè)置為:contextPath

三、soul-Bootstrap

網(wǎng)關(guān)層需要引入依賴即可

<!-- soul hystrix plugin start-->
  <dependency>
      <groupId>org.dromara</groupId>
      <artifactId>soul-spring-boot-starter-plugin-hystrix</artifactId>
       <version>${last.version}</version>
  </dependency>
  <!-- soul hystrix plugin end-->

四丽猬、測試

  • 測試用例來一發(fā)

觸發(fā)降級的兩個條件:滿足最大/最小并發(fā)量宿饱,或者達到異常比例。

所以使用wrk壓一下脚祟,讓流量先上到閾值谬以,便于觸發(fā)

wrk -t4 -c32 -d10s http://localhost:9195/http/test/findByUserId?userId=2

啟動測試一下::http://localhost:9195/http/test/findByUserId?userId=2

熔斷的返回值如下,fallback依舊是沒有成功由桌,可能跟格式有關(guān)系

{
    "code": 500,
    "message": "Internal Server Error",
    "data": "/http/test/findByUserId short-circuited and fallback failed."
}

五为黎、源碼分析

插件鏈的調(diào)用此處不再分析邮丰,請參考之前文章,直奔主題HystrixPlugin##doExecute

@Override
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
    // some code  .....
    // 將admin配置的rule實例化铭乾,json反序列化創(chuàng)建HystrixHandle對象剪廉,用于初始化Command
    final HystrixHandle hystrixHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), HystrixHandle.class);
    // some code  .....
    // 創(chuàng)建HystrixCommand
    Command command = fetchCommand(hystrixHandle, exchange, chain);
    return Mono.create(s -> {
    // 注冊完整執(zhí)行生命周期事件 :onCompleted、onError炕檩、onNext處理方式
        Subscription sub = command.fetchObservable().subscribe(s::success,
                s::error, s::success);
        s.onCancel(sub::unsubscribe);
        // 請求經(jīng)過command洗禮后斗蒋,判斷是否當(dāng)前已經(jīng)進入熔斷狀態(tài)
        if (command.isCircuitBreakerOpen()) {
            log.error("hystrix execute have circuitBreaker is Open! groupKey:{},commandKey:{}", hystrixHandle.getGroupKey(), hystrixHandle.getCommandKey());
        }
    }).doOnError(throwable -> {
        // 通過調(diào)試,doExecute執(zhí)行異常笛质,比如timeout才會執(zhí)行此處
        log.error("hystrix execute exception:", throwable);
        exchange.getAttributes().put(Constants.CLIENT_RESPONSE_RESULT_TYPE, ResultEnum.ERROR.getName());
        chain.execute(exchange);
    }).then();
}
image.png

onCompleted:onNext/onError完成之后最后回調(diào)

onError:當(dāng)產(chǎn)生異常時回調(diào)

onNext:獲取結(jié)果后回調(diào)

在fetchCommand方法泉沾,用于生成是信號量模式還是線程池模式的Command

image.png

HystrixHandle中給了ExecutionIsolationStrategy默認信號量的默認值

image.png

六、小結(jié)

  • 日拱一卒
  • 疑問:Hystrix已經(jīng)停止維護了经瓷,真實項目使用此插件是否存在安全隱患爆哑?
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舆吮,隨后出現(xiàn)的幾起案子揭朝,更是在濱河造成了極大的恐慌,老刑警劉巖色冀,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潭袱,死亡現(xiàn)場離奇詭異,居然都是意外死亡锋恬,警方通過查閱死者的電腦和手機屯换,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來与学,“玉大人彤悔,你說我怎么就攤上這事∷魇兀” “怎么了晕窑?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卵佛。 經(jīng)常有香客問我杨赤,道長,這世上最難降的妖魔是什么截汪? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任疾牲,我火速辦了婚禮,結(jié)果婚禮上衙解,老公的妹妹穿的比我還像新娘阳柔。我一直安慰自己,他們只是感情好蚓峦,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布盔沫。 她就那樣靜靜地躺著医咨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪架诞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天干茉,我揣著相機與錄音谴忧,去河邊找鬼。 笑死角虫,一個胖子當(dāng)著我的面吹牛沾谓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戳鹅,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼均驶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了枫虏?” 一聲冷哼從身側(cè)響起妇穴,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隶债,沒想到半個月后腾它,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡死讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年瞒滴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赞警。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妓忍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出愧旦,到底是詐尸還是另有隱情世剖,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布忘瓦,位于F島的核電站搁廓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耕皮。R本人自食惡果不足惜境蜕,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凌停。 院中可真熱鬧粱年,春花似錦、人聲如沸罚拟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拉队,卻和暖如春弊知,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粱快。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工秩彤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人事哭。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓漫雷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳍咱。 傳聞我的和親對象是個殘疾皇子降盹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容