java版spring cloud熔斷器Hystrix

1. 熔斷器

服務(wù)雪崩

在正常的微服務(wù)架構(gòu)體系下,一個(gè)業(yè)務(wù)很少有只需要調(diào)用一個(gè)服務(wù)就可以返回?cái)?shù)據(jù)的情況,這種比較常見的是出現(xiàn)在demo中,一般都是存在調(diào)用鏈的,比如A->B->C->D,如果D在某一個(gè)瞬間出現(xiàn)問題,比如網(wǎng)絡(luò)波動(dòng),io偏高,導(dǎo)致卡頓,隨著時(shí)間的流逝,后續(xù)的流量繼續(xù)請(qǐng)求,會(huì)造成D的壓力上升,有可能引起宕機(jī)。

你以為這就是結(jié)束么,圖樣圖森破,這才是噩夢(mèng)的開始,在同一個(gè)調(diào)用鏈上的ABC三個(gè)服務(wù)都會(huì)隨著D的宕機(jī)而引發(fā)宕機(jī),這還不是結(jié)束,一個(gè)服務(wù)不可能只有一個(gè)接口,當(dāng)它開始卡頓宕機(jī)時(shí),會(huì)影響到其他調(diào)用鏈的正常調(diào)用,最終導(dǎo)致所有的服務(wù)癱瘓。

如下圖所示:

熔斷器

相信大家都知道家用電閘,原來(lái)老式的電閘是使用保險(xiǎn)絲的(現(xiàn)在很多都是空氣開關(guān)了),當(dāng)家里用電量過大的時(shí)候,保險(xiǎn)絲經(jīng)常燒斷,這么做是保護(hù)家里的用電器,防止過載。

熔斷器的作用和這個(gè)很像,它可以實(shí)現(xiàn)快速失敗,如果在一段時(shí)間內(nèi)服務(wù)調(diào)用失敗或者異常,會(huì)強(qiáng)制要求當(dāng)前調(diào)用失敗,不在走遠(yuǎn)程調(diào)用,走服務(wù)降級(jí)操作(返回固定數(shù)據(jù)或者其他一些降級(jí)操作)。從而防止應(yīng)用程序不斷地嘗試執(zhí)行可能會(huì)失敗的操作,使得應(yīng)用程序繼續(xù)執(zhí)行而不用等待修正錯(cuò)誤,或者浪費(fèi)CPU時(shí)間去等到長(zhǎng)時(shí)間的超時(shí)產(chǎn)生。熔斷器也可以自動(dòng)診斷錯(cuò)誤是否已經(jīng)修正,如果已經(jīng)修正,應(yīng)用程序會(huì)再次嘗試調(diào)用操作。

熔斷器模式就像是那些容易導(dǎo)致錯(cuò)誤的操作的一種代理。這種代理能夠記錄最近調(diào)用發(fā)生錯(cuò)誤的次數(shù),然后決定使用允許操作繼續(xù),或者立即返回錯(cuò)誤。 Hystrix會(huì)有一個(gè)熔斷時(shí)間窗口,具體轉(zhuǎn)換邏輯如下:

熔斷器就是保護(hù)服務(wù)高可用的最后一道防線。

2. Hystrix

1. 斷路器機(jī)制

斷路器很好理解, 當(dāng)Hystrix Command請(qǐng)求后端服務(wù)失敗數(shù)量超過一定比例(默認(rèn)50%), 斷路器會(huì)切換到開路狀態(tài)(Open)。這時(shí)所有請(qǐng)求會(huì)直接失敗而不會(huì)發(fā)送到后端服務(wù)。斷路器保持在開路狀態(tài)一段時(shí)間后(默認(rèn)5秒), 自動(dòng)切換到半開路狀態(tài)(HALF-OPEN)。這時(shí)會(huì)判斷下一次請(qǐng)求的返回情況, 如果請(qǐng)求成功, 斷路器切回閉路狀態(tài)(CLOSED), 否則重新切換到開路狀態(tài)(OPEN)。Hystrix的斷路器就像我們家庭電路中的保險(xiǎn)絲, 一旦后端服務(wù)不可用, 斷路器會(huì)直接切斷請(qǐng)求鏈, 避免發(fā)送大量無(wú)效請(qǐng)求影響系統(tǒng)吞吐量, 并且斷路器有自我檢測(cè)并恢復(fù)的能力。

2. Fallback

Fallback相當(dāng)于是降級(jí)操作。對(duì)于查詢操作, 我們可以實(shí)現(xiàn)一個(gè)fallback方法, 當(dāng)請(qǐng)求后端服務(wù)出現(xiàn)異常的時(shí)候, 可以使用fallback方法返回的值。fallback方法的返回值一般是設(shè)置的默認(rèn)值或者來(lái)自緩存。

3. 資源隔離

在Hystrix中, 主要通過線程池來(lái)實(shí)現(xiàn)資源隔離。通常在使用的時(shí)候我們會(huì)根據(jù)調(diào)用的遠(yuǎn)程服務(wù)劃分出多個(gè)線程池。例如調(diào)用產(chǎn)品服務(wù)的Command放入A線程池, 調(diào)用賬戶服務(wù)的Command放入B線程池。這樣做的主要優(yōu)點(diǎn)是運(yùn)行環(huán)境被隔離開了。這樣就算調(diào)用服務(wù)的代碼存在bug或者由于其他原因?qū)е伦约核诰€程池被耗盡時(shí), 不會(huì)對(duì)系統(tǒng)的其他服務(wù)造成影響。但是帶來(lái)的代價(jià)就是維護(hù)多個(gè)線程池會(huì)對(duì)系統(tǒng)帶來(lái)額外的性能開銷。如果是對(duì)性能有嚴(yán)格要求而且確信自己調(diào)用服務(wù)的客戶端代碼不會(huì)出問題的話, 可以使用Hystrix的信號(hào)模式(Semaphores)來(lái)隔離資源。

3. Feign Hystrix

上一篇我們使用了producer和consumers,熔斷器是只作用在服務(wù)調(diào)用端,因此上一篇使用到的consumers我們可以直接拿來(lái)使用。因?yàn)?,F(xiàn)eign中已經(jīng)依賴了Hystrix所以在maven配置上不用做任何改動(dòng)。

1. 配置文件application.yml新增

server:? port:8081spring:? application:? ? name:spring-cloud-consumerseureka:? client:? ? service-url:? ? ? defaultZone:http://localhost:8761/eureka/feign:? hystrix:? ? enabled:true

其中新增了feign.hystrix.enabled = true

2. 創(chuàng)建fallback類,繼承與HelloRemote實(shí)現(xiàn)回調(diào)的方法

packagecom.springcloud.consumers.fallback;importcom.springcloud.consumers.remote.HelloRemote;importorg.springframework.stereotype.Component;importorg.springframework.web.bind.annotation.RequestParam;/** * Created with IntelliJ IDEA. * *@User: weishiyao *@Date: 2019/7/2 *@Time: 23:14 *@email: inwsy@hotmail.com * Description: */@ComponentpublicclassHelloRemoteFallBackimplementsHelloRemote{@OverridepublicStringhello(@RequestParam(value ="name")String name){return"hello "+ name +", i am fallback massage";? ? }}

3. 添加fallback屬性

在HelloRemote類添加指定fallback類,在服務(wù)熔斷的時(shí)候返回fallback類中的內(nèi)容。

packagecom.springcloud.consumers.remote;importcom.springcloud.consumers.fallback.HelloRemoteFallBack;importorg.springframework.cloud.openfeign.FeignClient;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestParam;/** *@Author: shiyao.wei *@Date: 2019/7/2 11:14 *@Version: 1.0 *@Desc: */@FeignClient(name="SPRING-CLOUD-PRODUCER", fallback = HelloRemoteFallBack.class)publicinterfaceHelloRemote{@RequestMapping(value ="/hello")Stringhello(@RequestParam(value ="name")String name);}

所有改動(dòng)結(jié)束。

4. 測(cè)試

現(xiàn)在我們測(cè)試看下結(jié)果,老規(guī)矩,順次啟動(dòng)注冊(cè)中心Eureka、provider、consumer

訪問上一節(jié)我們?cè)L問過的鏈接:http://localhost:8081/hello/spring

現(xiàn)在可以看到頁(yè)面正常顯示:hello spring,producer is ready

現(xiàn)在我們手動(dòng)把provider停掉,再訪問一下鏈接看一下:

現(xiàn)在頁(yè)面已經(jīng)顯示我們?nèi)蹟嗪蟮男畔⒘耍篽ello spring, i am fallback massage

現(xiàn)在說明我們的測(cè)試已經(jīng)成功了。(企業(yè)架構(gòu)源碼可以加求球:三五三六二四七二五九)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 熔斷器 服務(wù)雪崩 在正常的微服務(wù)架構(gòu)體系下,一個(gè)業(yè)務(wù)很少有只需要調(diào)用一個(gè)服務(wù)就可以返回?cái)?shù)據(jù)的情況,這種比較常...
    fumi106閱讀 207評(píng)論 0 0
  • 在微服務(wù)架構(gòu)中,根據(jù)業(yè)務(wù)來(lái)拆分成一個(gè)個(gè)的服務(wù),服務(wù)與服務(wù)之間可以相互調(diào)用(RPC),在Spring Cloud可以...
    Java大寶寶閱讀 441評(píng)論 0 0
  • 推薦指數(shù): 6.0 書籍主旨關(guān)鍵詞:特權(quán)、焦點(diǎn)、注意力、語(yǔ)言聯(lián)想、情景聯(lián)想 觀點(diǎn): 1.統(tǒng)計(jì)學(xué)現(xiàn)在叫數(shù)據(jù)分析,社會(huì)...
    Jenaral閱讀 5,991評(píng)論 0 5
  • 昨天,在回家的路上,坐在車?yán)镉圃沼圃盏乜粗摹度龉衬墓适隆?,我被里面的?nèi)容深深吸引住了,盡管上學(xué)時(shí)...
    夜闌曉語(yǔ)閱讀 3,945評(píng)論 2 9
  • 一月四號(hào)的大沙有個(gè)想法。從昨晚到現(xiàn)在就一直圍繞在腦子里?;蛟S深受那些小說的影響,或許真的就是我自己腦子或者精神么有...
    一個(gè)人的大沙閱讀 4,361評(píng)論 3 4

友情鏈接更多精彩內(nèi)容