<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          spring cloud------ hystrix熔斷機(jī)制

          共 3633字,需瀏覽 8分鐘

           ·

          2021-03-19 05:22

          ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

          在spring cloud微服務(wù)架構(gòu)中熔斷機(jī)制是必不可少的一個(gè)重要功能點(diǎn)。我們先了解一下什么是熔斷,熔斷是怎么產(chǎn)生的?
          一、熔斷產(chǎn)生的原因


          雪崩效應(yīng):是一種因服務(wù)提供者的不可用導(dǎo)致服務(wù)調(diào)用者的不可用,并將不可用逐漸放大的過(guò)程。
          比如我們?nèi)ピL問(wèn)一個(gè)服務(wù)的時(shí)候,發(fā)現(xiàn)這個(gè)服務(wù)崩了,然后我們一直在訪問(wèn),后面的也一直排隊(duì)等訪問(wèn),但是我們有沒(méi)有成功,導(dǎo)致后面所有的請(qǐng)求在排隊(duì),就越來(lái)越多的請(qǐng)求等待,這時(shí)候系統(tǒng)的資源也會(huì)被逐漸的給耗盡,導(dǎo)致所有的服務(wù)都可能崩。
          產(chǎn)生的原因:
          1、服務(wù)提供者出現(xiàn)故障導(dǎo)致不可用 :短時(shí)間大量的用戶請(qǐng)求;硬件故障:硬件損壞造成的服務(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ù)不可用;
          2、開(kāi)啟重試機(jī)制導(dǎo)致流量的增加;
          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)生了。




          二、什么是熔斷


          可能一提及到熔斷的話,大家第一時(shí)間可能就想起保險(xiǎn)絲,對(duì),沒(méi)錯(cuò),其實(shí)代碼中熔斷的作用和保險(xiǎn)絲是一樣的,都是為了保護(hù)我們的東西不受損,保險(xiǎn)絲保護(hù)我們的用電器不會(huì)損壞,編程中保護(hù)我們的服務(wù)資源不會(huì)被耗盡。總的來(lái)說(shuō)就相當(dāng)于一個(gè)保護(hù)機(jī)制。他有兩個(gè)方面一個(gè)叫服務(wù)熔斷:就是當(dāng)這個(gè)服務(wù)出現(xiàn)故障的時(shí)候,來(lái)訪問(wèn)我的請(qǐng)求我會(huì)直接響應(yīng)他一個(gè)fallback而不會(huì)讓他一直等待請(qǐng)求。還有一個(gè)就是服務(wù)降級(jí):當(dāng)服務(wù)器壓力劇增的情況下,根據(jù)當(dāng)前業(yè)務(wù)情況及流量對(duì)一些服務(wù)和頁(yè)面有策略的降級(jí),以此釋放服務(wù)器資源以保證核心任務(wù)的正常運(yùn)行。
          三、hystrix的工作原理
          我們用下面的這個(gè)圖來(lái)講:
          bcc2966f7d5606328717ccc932774734.webp




          在沒(méi)有hystrix之前,假如我們有100個(gè)線程可供調(diào)用,這時(shí)候我們1000的請(qǐng)求訪問(wèn)的時(shí)候是隨機(jī)去訪問(wèn)的,也就是說(shuō)前100個(gè)請(qǐng)求會(huì)去占用線程,后面的會(huì)去等待,加入運(yùn)氣不好,前面的100個(gè)請(qǐng)求都是去請(qǐng)求服務(wù)1的話,并且服務(wù)1出現(xiàn)故障,那么就會(huì)導(dǎo)致所有線程都不會(huì)釋放,而剩下的9990個(gè)請(qǐng)求都在排隊(duì)等待,如果后續(xù)還有請(qǐng)求,那么我們系統(tǒng)就要崩了。
          而hystrix的原理其實(shí)是在服務(wù)和請(qǐng)求之前增加了一個(gè)線程池,原理其實(shí)就是用戶的請(qǐng)求將不再直接訪問(wèn)服務(wù),而是通過(guò)線程池中的空閑線程來(lái)訪問(wèn)服務(wù),如果線程池已滿,則會(huì)進(jìn)行降級(jí)處理,用戶的請(qǐng)求不會(huì)被阻塞,至少可以看到一個(gè)執(zhí)行結(jié)果(例如返回友好的提示信息),而不是無(wú)休止的等待或者看到系統(tǒng)崩潰。
          1、Hystrix為每個(gè)依賴調(diào)用分配一個(gè)小的線程池,如果線程池已滿調(diào)用將被立即拒絕,默認(rèn)不采用排隊(duì).加速失敗判定時(shí)間。線程數(shù)是可以被設(shè)定的。
          在加hystrix之前我們是上圖這樣的結(jié)構(gòu),加入之后是這樣的:
          de4c157cc865690592918cd85a3d00b0.webp


          我們這樣就在某個(gè)服務(wù)之前都分配了20個(gè)線程,這樣的話,當(dāng)我們的請(qǐng)求進(jìn)來(lái)的時(shí)候,不管你前面的請(qǐng)求有多少個(gè)是服務(wù)1的都不會(huì)影響其他的服務(wù),如果某個(gè)服務(wù)的線程滿了的話,那么接下來(lái)請(qǐng)求會(huì)被拒絕或是降級(jí)。
          如果某個(gè)目標(biāo)服務(wù)調(diào)用慢或者有大量超時(shí),此時(shí),熔斷該服務(wù)的調(diào)用,對(duì)于后續(xù)調(diào)用請(qǐng)求,不在繼續(xù)調(diào)用目標(biāo)服務(wù),直接返回,快速釋放資源。如果目標(biāo)服務(wù)情況好轉(zhuǎn)則恢復(fù)調(diào)用。




          熔斷器是位于線程池之前的組件。用戶請(qǐng)求某一服務(wù)之后,Hystrix會(huì)先經(jīng)過(guò)熔斷器,此時(shí)如果熔斷器的狀態(tài)是打開(kāi)(跳起),則說(shuō)明已經(jīng)熔斷,這時(shí)將直接進(jìn)行降級(jí)處理,不會(huì)繼續(xù)將請(qǐng)求發(fā)到線程池。熔斷器相當(dāng)于在線程池之前的一層屏障。每個(gè)熔斷器默認(rèn)維護(hù)10個(gè)bucket ,每秒創(chuàng)建一個(gè)bucket ,每個(gè)blucket記錄成功,失敗,超時(shí),拒絕的次數(shù)。當(dāng)有新的bucket被創(chuàng)建時(shí),最舊的bucket會(huì)被拋棄。
          1f3ef85a8a911a3b70ff3d682254769b.webp


          • Closed:

            熔斷器關(guān)閉狀態(tài),調(diào)用失敗次數(shù)積累,到了閾值(或一定比例)則啟動(dòng)熔斷機(jī)制;

          • Open:

            熔斷器打開(kāi)狀態(tài),此時(shí)對(duì)下游的調(diào)用都內(nèi)部直接返回錯(cuò)誤,不走網(wǎng)絡(luò),但設(shè)計(jì)了一個(gè)時(shí)鐘選項(xiàng),默認(rèn)的時(shí)鐘達(dá)到了一定時(shí)間(這個(gè)時(shí)間一般設(shè)置成平均故障處理時(shí)間,也就是MTTR),到了這個(gè)時(shí)間,進(jìn)入半熔斷狀態(tài);

          • Half-Open:

            半熔斷狀態(tài),允許定量的服務(wù)請(qǐng)求,如果調(diào)用都成功(或一定比例)則認(rèn)為恢復(fù)了,關(guān)閉熔斷器,否則認(rèn)為還沒(méi)好,又回到熔斷器打開(kāi)狀態(tài);


            四、spring boot中如何使用hystrix


          <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-hystrix</artifactId>
          </dependency>


          我們?cè)趐om文件里面添加上面這個(gè)依賴。
          添加完以后在我們的主函數(shù)上面添加這個(gè)注解@EnableHystrix或者是@EnableCircuitBreaker。
          然后在你需要熔斷操作的方法上面加一個(gè) @HystrixCommand(fallbackMethod=”你需要回調(diào)的方法名”)注解,比如我們這樣


            @RequestMapping("/zj")
          @HystrixCommand(fallbackMethod="test")
          public String zj(){
          return "zjhystrix";
          }
          public String test(){
          return "error";
          }



          上面的代碼其實(shí)就是當(dāng)我們請(qǐng)求調(diào)用這個(gè)接口的時(shí)候,我們發(fā)現(xiàn)這個(gè)接口有問(wèn)題或者在加載過(guò)程中,這時(shí)候他不會(huì)一直去 等待響應(yīng),而是到達(dá)一個(gè)時(shí)間點(diǎn)后直接返回test里面的內(nèi)容。之后的請(qǐng)求也就直接往test走,直到熔斷恢復(fù)。
          在spring cloud中還有一個(gè)hystrix監(jiān)控,這個(gè)是Spring提供了hystrix-dashboard項(xiàng)目對(duì)支持hystrix熔斷的項(xiàng)目提供鏈路狀態(tài)監(jiān)視的功能。
          我們需要導(dǎo)入如下包


            <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-actuator</artifactId>
          </dependency>
          <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-hystrix</artifactId>
          </dependency>
          <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
          </dependency>



          然后在我們運(yùn)行的主函數(shù)里面添加注解@EnableHystrixDashboard
          然后訪問(wèn)http://localhost:8080/hystrix就會(huì)出現(xiàn)如下頁(yè)面
          610bee0389b1e13d0a91fd9fa1f09253.webp
          我們往里面添加這個(gè)http://localhost:8080/hystrix.stream并點(diǎn)擊monitor stream按鈕
          進(jìn)去之后看到是這樣的頁(yè)面
          fa2432dafc6fc45a0fd26d6810d6307e.webp
          因?yàn)闆](méi)有請(qǐng)求,所以一直處于loading,我們?cè)L問(wèn)一下我們的那個(gè)接口,這時(shí)候就會(huì)出現(xiàn)另一個(gè)頁(yè)面
          511e671d6372e36566d83bb476a4adbb.webp
          至于上面的每個(gè)指標(biāo)我就不一一講了。這個(gè)只是監(jiān)控單應(yīng)用的。


          ? ? ? ? ? ? ? ?



          本文鏈接:https://blog.csdn.net/u013825231/article/details/79949420

          end


          *版權(quán)聲明:轉(zhuǎn)載文章和圖片均來(lái)自公開(kāi)網(wǎng)絡(luò),版權(quán)歸作者本人所有,推送文章除非無(wú)法確認(rèn),我們都會(huì)注明作者和來(lái)源。如果出處有誤或侵犯到原作者權(quán)益,請(qǐng)與我們聯(lián)系刪除或授權(quán)事宜。


          長(zhǎng)按識(shí)別圖中二維碼

          關(guān)注獲取更多資訊




          不點(diǎn)關(guān)注,我們哪來(lái)故事?



          0a5f170ec8a6156202aa401512c9e56c.webp

          點(diǎn)個(gè)再看,你最好看




          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日本一二三区豆花视频 | 亚洲国产色情视频 | 日本破处视频 | 俺看逼| 国产高清一级a片免费看古女 |