SpringCloud Hystrix 功能簡(jiǎn)介

1.Hystrix的概述

在分布式系統(tǒng)中,每個(gè)服務(wù)都可能會(huì)調(diào)用很多其他服務(wù),被調(diào)用的那些服務(wù)就是依賴服務(wù),有的時(shí)候某些依賴服務(wù)出現(xiàn)故障也是很正常的。

Hystrix可以讓我們?cè)诜植际较到y(tǒng)中對(duì)服務(wù)間的調(diào)用進(jìn)行控制,加入一些調(diào)用延遲或者依賴故障的容錯(cuò)機(jī)制。

Hystrix通過(guò)將依賴服務(wù)進(jìn)行資源隔離,進(jìn)而組織某個(gè)依賴服務(wù)出現(xiàn)故障的時(shí)候,這種故障在整個(gè)系統(tǒng)所有的依賴服務(wù)調(diào)用中進(jìn)行蔓延,同時(shí)Hystrix還提供故障時(shí)的fallback降級(jí)機(jī)制

總而言之,Hystrix通過(guò)這些方法幫助我們提升分布式系統(tǒng)的可用性和穩(wěn)定性

2.Hystrix的功能

hystrix,就是一種高可用保障的一個(gè)框架,類(lèi)似于spring(ioc,mvc),mybatis,activiti,lucene,框架,預(yù)先封裝好的為了解決某個(gè)特定領(lǐng)域的特定問(wèn)題的一套代碼庫(kù)

高可用性保障的一個(gè)框架

3.Hystrix的設(shè)計(jì)原則是什么?

(1)對(duì)依賴服務(wù)調(diào)用時(shí)出現(xiàn)的調(diào)用延遲和調(diào)用失敗進(jìn)行控制和容錯(cuò)保護(hù)

(2)在復(fù)雜的分布式系統(tǒng)中,阻止某一個(gè)依賴服務(wù)的故障在整個(gè)系統(tǒng)中蔓延,服務(wù)A->服務(wù)B->服務(wù)C,服務(wù)C故障了,服務(wù)B也故障了,服務(wù)A故障了,整套分布式系統(tǒng)全部故障,整體宕機(jī)

(3)提供fail-fast(快速失敗)和快速恢復(fù)的支持

(4)提供fallback優(yōu)雅降級(jí)的支持

(5)支持近實(shí)時(shí)的監(jiān)控、報(bào)警以及運(yùn)維操作

調(diào)用延遲+失敗,提供容錯(cuò)

阻止故障蔓延

快速失敗+快速恢復(fù)

降級(jí)

監(jiān)控+報(bào)警+運(yùn)維

完全描述了hystrix的功能,提供整個(gè)分布式系統(tǒng)的高可用的架構(gòu)

4、Hystrix要解決的問(wèn)題是什么?

(1)在復(fù)雜的分布式系統(tǒng)架構(gòu)中,每個(gè)服務(wù)都有很多的依賴服務(wù),而每個(gè)依賴服務(wù)都可能會(huì)故障

(2)如果服務(wù)沒(méi)有和自己的依賴服務(wù)進(jìn)行隔離,那么可能某一個(gè)依賴服務(wù)的故障就會(huì)拖垮當(dāng)前這個(gè)服務(wù)

舉例來(lái)說(shuō),某個(gè)服務(wù)有30個(gè)依賴服務(wù),每個(gè)依賴服務(wù)的可用性非常高,已經(jīng)達(dá)到了99.99%的高可用性,那么該服務(wù)的可用性就是99.99%的30次方,也就是99.7%的可用性,

99.7%的可用性就意味著3%的請(qǐng)求可能會(huì)失敗,因?yàn)?%的時(shí)間內(nèi)系統(tǒng)可能出現(xiàn)了故障不可用了,對(duì)于1億次訪問(wèn)來(lái)說(shuō),3%的請(qǐng)求失敗,也就意味著300萬(wàn)次請(qǐng)求會(huì)失敗,也意味著每個(gè)月有2個(gè)小時(shí)的時(shí)間系統(tǒng)是不可用的,在真實(shí)生產(chǎn)環(huán)境中,可能更加糟糕,上面也就是說(shuō),即使你每個(gè)依賴服務(wù)都是99.99%高可用性,但是一旦你有幾十個(gè)依賴服務(wù),還是會(huì)導(dǎo)致你每個(gè)月都有幾個(gè)小時(shí)是不可用的


5、再看Hystrix的更加細(xì)節(jié)的設(shè)計(jì)原則是什么?

(1)阻止任何一個(gè)依賴服務(wù)耗盡所有的資源,比如tomcat中的所有線程資源

(2)避免請(qǐng)求排隊(duì)和積壓,采用限流和fail fast來(lái)控制故障

(3)提供fallback降級(jí)機(jī)制來(lái)應(yīng)對(duì)故障

(4)使用資源隔離技術(shù),比如bulkhead(艙壁隔離技術(shù)),swimlane(泳道技術(shù)),circuit breaker(短路技術(shù)),來(lái)限制任何一個(gè)依賴服務(wù)的故障的影響

(5)通過(guò)近實(shí)時(shí)的統(tǒng)計(jì)/監(jiān)控/報(bào)警功能,來(lái)提高故障發(fā)現(xiàn)的速度

(6)通過(guò)近實(shí)時(shí)的屬性和配置熱修改功能,來(lái)提高故障處理和恢復(fù)的速度

(7)保護(hù)依賴服務(wù)調(diào)用的所有故障情況,而不僅僅只是網(wǎng)絡(luò)故障情況,調(diào)用這個(gè)依賴服務(wù)的時(shí)候,client調(diào)用包有bug,阻塞,等等,依賴服務(wù)的各種各樣的調(diào)用的故障,都可以處理

6、Hystrix是如何實(shí)現(xiàn)它的目標(biāo)的?

(1)通過(guò)HystrixCommand或者HystrixObservableCommand來(lái)封裝對(duì)外部依賴的訪問(wèn)請(qǐng)求,這個(gè)訪問(wèn)請(qǐng)求一般會(huì)運(yùn)行在獨(dú)立的線程中,資源隔離

(2)對(duì)于超出我們?cè)O(shè)定閾值的服務(wù)調(diào)用,直接進(jìn)行超時(shí),不允許其耗費(fèi)過(guò)長(zhǎng)時(shí)間阻塞住。這個(gè)超時(shí)時(shí)間默認(rèn)是99.5%的訪問(wèn)時(shí)間,但是一般我們可以自己設(shè)置一下

(3)為每一個(gè)依賴服務(wù)維護(hù)一個(gè)獨(dú)立的線程池,或者是semaphore,當(dāng)線程池已滿時(shí),直接拒絕對(duì)這個(gè)服務(wù)的調(diào)用

(4)對(duì)依賴服務(wù)的調(diào)用的成功次數(shù),失敗次數(shù),拒絕次數(shù),超時(shí)次數(shù),進(jìn)行統(tǒng)計(jì)

(5)如果對(duì)一個(gè)依賴服務(wù)的調(diào)用失敗次數(shù)超過(guò)了一定的閾值,自動(dòng)進(jìn)行熔斷,在一定時(shí)間內(nèi)對(duì)該服務(wù)的調(diào)用直接降級(jí),一段時(shí)間后再自動(dòng)嘗試恢復(fù)

(6)當(dāng)一個(gè)服務(wù)調(diào)用出現(xiàn)失敗,被拒絕,超時(shí),短路等異常情況時(shí),自動(dòng)調(diào)用fallback降級(jí)機(jī)制

(7)對(duì)屬性和配置的修改提供近實(shí)時(shí)的支持

7、簡(jiǎn)單案例

(1)引入依賴

<!-- hystrix斷路器 -->

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>

</dependency>

(2)相關(guān)配置

# 配置開(kāi)啟

feign:

? hystrix:

? ? enabled: true

# hystrix禁止服務(wù)超時(shí),默認(rèn)為1s就會(huì)走服務(wù)降級(jí),導(dǎo)致業(yè)務(wù)邏輯正常走了,只是因?yàn)闆](méi)及時(shí)返回導(dǎo)致走了服務(wù)降級(jí)的操作

hystrix:?

command:

? default:

? ? ? execution:

? ? ? timeout:

? ? ? ? enabled: false

生產(chǎn)環(huán)境不要寫(xiě)false,最好是設(shè)置超時(shí)時(shí)間,默認(rèn)為1s

??? (3) ?? 代碼塊


@SpringBootApplication

@EnableEurekaClient

@EnableFeignClients

@EnableHystrix

public class AppOrder{

publicstaticvoidmain(String[]args){

SpringApplication.run(AppOrder.class,args);

?????? }

}

?????//服務(wù)降級(jí)demo

? ? @HystrixCommand(fallbackMethod ="orderToUserInfoFallback")

@GetMapping("/orderToUserInfo")

public ResponseBaseorderToUserInfoHystrix() {

System.out.println("orderToUserInfo:" +"當(dāng)前線程池名稱:" + Thread.currentThread().getName());

? ? ? ? return memberServiceFeigin.getUserInfo();

? ? }

@RequestMapping("/orderToUserInfoFallback")

public ResponseBaseorderToUserInfoFallback() {

return setResultError("系統(tǒng)錯(cuò)誤!!!!");

? ? }

(4)Fallback方法獨(dú)立模塊

使用@HystrixCommand會(huì)很復(fù)雜,尤其是把fallbackMethod寫(xiě)在每個(gè)具體的類(lèi)里。

可以把fallbackMethod寫(xiě)到獨(dú)立的模塊,繼承Feign客戶端,然后在feignClient里加上fallback對(duì)應(yīng)的類(lèi)即可。

@FeignClient(name=””,fallbackMethod=A1.class)

public Aextends Interfaces{};

? ? public A1extends A{

@Override

public method1(){

//fallback具體內(nèi)容

? ? ? ? }

}

(5)Fallback與blockHandler的區(qū)別

fallback是服務(wù)熔斷或者業(yè)務(wù)邏輯出現(xiàn)異常執(zhí)行的方法(1.6版本以上)

blockHandler 限流出現(xiàn)錯(cuò)誤執(zhí)行的方法。

?????????????????????????????????????????????????????????????????????????? 《什么是分布式系統(tǒng)以及其中的故障和Hystrix》

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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