日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
怎么理解SpringCloudHystrix熔斷

這篇文章主要介紹“怎么理解Spring Cloud Hystrix熔斷”,在日常操作中,相信很多人在怎么理解Spring Cloud Hystrix熔斷問題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”怎么理解Spring Cloud Hystrix熔斷”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)長(zhǎng)期為數(shù)千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為碑林企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,碑林網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

一、什么是熔斷

在一個(gè)家庭中有各種各樣的家電,我們假設(shè)每個(gè)家電都沒有保險(xiǎn)絲,一旦有一天某個(gè)家電出現(xiàn)短路,造成整個(gè)電路短路然后很有可能就把整個(gè)家庭的電器及電路給燒壞了。但如果每個(gè)家電入口線路都有一個(gè)保險(xiǎn)絲(斷路器),那么不管那個(gè)家電發(fā)生短路這個(gè)家電的保險(xiǎn)絲就會(huì)快速熔斷(斷開電路),從而保護(hù)了整個(gè)電路及電路上其它的家電的正常運(yùn)行。

軟件行業(yè)里面的熔斷機(jī)制與這個(gè)一致,在整個(gè)微服務(wù)集群中,由于其中一個(gè)或者幾個(gè)微服務(wù)出現(xiàn)故障或堵塞,若沒有快速的熔斷機(jī)制,就會(huì)造成整個(gè)微服務(wù)集群的擁堵最終整個(gè)微服務(wù)出現(xiàn)雪崩被拖死。熔斷機(jī)制的核心機(jī)制就是在確保某個(gè)微服務(wù)出現(xiàn)故障的時(shí)候?qū)崿F(xiàn)快速熔斷(斷路)或者服務(wù)降級(jí)快速失敗,避免擁堵。從而保證其它業(yè)務(wù)其它服務(wù)的正常運(yùn)行。

二、Hystrix 設(shè)計(jì)原則

  1. 防止單個(gè)服務(wù)的故障,耗盡整個(gè)系統(tǒng)服務(wù)的容器(比如tomcat)的線程資源,避免分布式環(huán)境里大量級(jí)聯(lián)失敗。通過第三方客戶端訪問(通常是通過網(wǎng)絡(luò))依賴服務(wù)出現(xiàn)失敗、拒絕、超時(shí)或短路時(shí)執(zhí)行回退邏輯。
     

  2. 用快速失敗代替排隊(duì)(每個(gè)依賴服務(wù)維護(hù)一個(gè)小的線程池或信號(hào)量,當(dāng)線程池滿或信號(hào)量滿,會(huì)立即拒絕服務(wù)而不會(huì)排隊(duì)等待)和優(yōu)雅的服務(wù)降級(jí);當(dāng)依賴服務(wù)失效后又恢復(fù)正常,快速恢復(fù)。
     

  3. 提供接近實(shí)時(shí)的監(jiān)控和警報(bào),從而能夠快速發(fā)現(xiàn)故障和修復(fù)。監(jiān)控信息包括請(qǐng)求成功,失?。蛻舳藪伋龅漠惓#瑫r(shí)和線程拒絕。如果訪問依賴服務(wù)的錯(cuò)誤百分比超過閾值,斷路器會(huì)跳閘,此時(shí)服務(wù)會(huì)在一段時(shí)間內(nèi)停止對(duì)特定服務(wù)的所有請(qǐng)求。
     

  4. 將所有請(qǐng)求外部系統(tǒng)(或請(qǐng)求依賴服務(wù))封裝到HystrixCommand或HystrixObservableCommand對(duì)象中,然后這些請(qǐng)求在一個(gè)獨(dú)立的線程中執(zhí)行。使用隔離技術(shù)來(lái)限制任何一個(gè)依賴的失敗對(duì)系統(tǒng)的影響。每個(gè)依賴服務(wù)維護(hù)一個(gè)小的線程池(或信號(hào)量),當(dāng)線程池滿或信號(hào)量滿,會(huì)立即拒絕服務(wù)而不會(huì)排隊(duì)等待。

三、Hystrix特性

  1. 請(qǐng)求熔斷: 當(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. 服務(wù)降級(jí):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. 依賴隔離(采用艙壁模式,Docker就是艙壁模式的一種):在Hystrix中, 主要通過線程池來(lái)實(shí)現(xiàn)資源隔離. 通常在使用的時(shí)候我們會(huì)根據(jù)調(diào)用的遠(yuǎn)程服務(wù)劃分出多個(gè)線程池.比如說,一個(gè)服務(wù)調(diào)用另外兩個(gè)服務(wù),你如果調(diào)用兩個(gè)服務(wù)都用一個(gè)線程池,那么如果一個(gè)服務(wù)卡在哪里,資源沒被釋放后面的請(qǐng)求又來(lái)了,導(dǎo)致后面的請(qǐng)求都卡在哪里等待,導(dǎo)致你依賴的A服務(wù)把你卡在哪里,耗盡了資源,也導(dǎo)致了你另外一個(gè)B服務(wù)也不可用了。這時(shí)如果依賴隔離,某一個(gè)服務(wù)調(diào)用A B兩個(gè)服務(wù),如果這時(shí)我有100個(gè)線程可用,我給A服務(wù)分配50個(gè),給B服務(wù)分配50個(gè),這樣就算A服務(wù)掛了,我的B服務(wù)依然可以用。

  4. 請(qǐng)求緩存:比如一個(gè)請(qǐng)求過來(lái)請(qǐng)求我userId=1的數(shù)據(jù),你后面的請(qǐng)求也過來(lái)請(qǐng)求同樣的數(shù)據(jù),這時(shí)我不會(huì)繼續(xù)走原來(lái)的那條請(qǐng)求鏈路了,而是把第一次請(qǐng)求緩存過了,把第一次的請(qǐng)求結(jié)果返回給后面的請(qǐng)求(參考@CacheResult、@CacheKey@CacheRemove注解)。
     

  5. 請(qǐng)求合并:我依賴于某一個(gè)服務(wù),我要調(diào)用N次,比如說查數(shù)據(jù)庫(kù)的時(shí)候,我發(fā)了N條請(qǐng)求發(fā)了N條SQL然后拿到一堆結(jié)果,這時(shí)候我們可以把多個(gè)請(qǐng)求合并成一個(gè)請(qǐng)求,發(fā)送一個(gè)查詢多條數(shù)據(jù)的SQL的請(qǐng)求,這樣我們只需查詢一次數(shù)據(jù)庫(kù),提升了效率。

在Hystrix 中我們用的比較多的是前三點(diǎn),后面兩點(diǎn)并不適用于所有業(yè)務(wù)。

四、實(shí)戰(zhàn)

1、添加依賴

添加 `spring-cloud-starter-hystrix`模塊,實(shí)際使用過程中我們使用了Feign后已經(jīng)包含了Hystrix模塊及Ribbon模塊,不需要單獨(dú)引入。


   org.springframework.cloud
   spring-cloud-starter-hystrix

2、開啟Hystrix 

在啟動(dòng)類中加入@EnableCircuitBreaker注解,表示允許斷路器。如下代碼所示:

//允許斷路器
@EnableCircuitBreaker
public class Application {
     
   ...
}

在spring cloud 項(xiàng)目中使用 `@SpringCloudApplication` 注解后已經(jīng)包含了`@EnableCircuitBreaker` 注解及其它微服務(wù)注解,看源碼:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public @interface SpringCloudApplication {
}

3、方法級(jí)熔斷

Spring cloud 采用http進(jìn)行通訊,spring cloud 結(jié)合Eureka針對(duì)http請(qǐng)求響應(yīng)操作做了封裝,支持兩種方式,RestTemplate 及 Feign 模式,F(xiàn)eign模式參考其它章節(jié),這里簡(jiǎn)單介紹RestTemplate模式。

@Service
public class HelloService {
 
    @Autowired
    private RestTemplate restTemplate;
 
  //請(qǐng)求熔斷注解,當(dāng)服務(wù)出現(xiàn)問題時(shí)候會(huì)執(zhí)行fallbackMetho屬性的名為helloFallBack的方法
    @HystrixCommand(fallbackMethod = "helloFallBack")
    public String helloService() throws ExecutionException, InterruptedException {
        return restTemplate.getForEntity("http://HELLO-SERVICE/hello",String.class).getBody();
  }
  
  public String helloFallBack(){
      return "error";
  }
 
}

這是一個(gè)外部服務(wù)調(diào)用的restTemplate實(shí)現(xiàn),通過 @HystrixCommand(fallbackMethod = "helloFallBack") 標(biāo)志這個(gè)方法開啟熔斷機(jī)制, 指定熔斷后服務(wù)降級(jí)方法為:helloFallBack()。此時(shí)若被調(diào)用方異常,接下來(lái)請(qǐng)求都會(huì)進(jìn)入服務(wù)降級(jí)實(shí)現(xiàn)(回調(diào)方法)并快速失敗。@HystrixCommand 也可以指定其它配置:

public @interface HystrixCommand {
    String groupKey() default "";
 
    String commandKey() default "";
 
    String threadPoolKey() default "";
 
    String fallbackMethod() default "";
 
    HystrixProperty[] commandProperties() default {};
 
    HystrixProperty[] threadPoolProperties() default {};
 
    Class[] ignoreExceptions() default {};
 
    ObservableExecutionMode observableExecutionMode() default ObservableExecutionMode.EAGER;
 
    HystrixException[] raiseHystrixExceptions() default {};
 
    String defaultFallback() default "";
}

讓我們來(lái)逐個(gè)介紹下@HystrixCommand注解的各個(gè)參數(shù):

  1. commandKey:配置全局唯一標(biāo)識(shí)服務(wù)的名稱,比如,庫(kù)存系統(tǒng)有一個(gè)獲取庫(kù)存服務(wù),那么就可以為這個(gè)服務(wù)起一個(gè)名字來(lái)唯一識(shí)別該服務(wù),如果不配置,則默認(rèn)是@HystrixCommand注解修飾的函數(shù)的函數(shù)名。
     

  2. groupKey:一個(gè)比較重要的注解,配置全局唯一標(biāo)識(shí)服務(wù)分組的名稱,比如,庫(kù)存系統(tǒng)就是一個(gè)服務(wù)分組。通過設(shè)置分組,Hystrix會(huì)根據(jù)組來(lái)組織和統(tǒng)計(jì)命令的告、儀表盤等信息。Hystrix命令默認(rèn)的線程劃分也是根據(jù)命令組來(lái)實(shí)現(xiàn)。默認(rèn)情況下,Hystrix會(huì)讓相同組名的命令使用同一個(gè)線程池,所以我們需要在創(chuàng)建Hystrix命令時(shí)為其指定命令組來(lái)實(shí)現(xiàn)默認(rèn)的線程池劃分。此外,Hystrix還提供了通過設(shè)置threadPoolKey來(lái)對(duì)線程池進(jìn)行設(shè)置。建議最好設(shè)置該參數(shù),使用threadPoolKey來(lái)控制線程池組。
     

  3. threadPoolKey:對(duì)線程池進(jìn)行設(shè)定,細(xì)粒度的配置,相當(dāng)于對(duì)單個(gè)服務(wù)的線程池信息進(jìn)行設(shè)置,也可多個(gè)服務(wù)設(shè)置同一個(gè)threadPoolKey構(gòu)成線程組。
     

  4. fallbackMethod:@HystrixCommand注解修飾的函數(shù)的回調(diào)函數(shù),@HystrixCommand修飾的函數(shù)必須和這個(gè)回調(diào)函數(shù)定義在同一個(gè)類中,因?yàn)槎x在了同一個(gè)類中,所以fackback method可以是public/private均可。
     

  5. commandProperties:配置該命令的一些參數(shù),如executionIsolationStrategy配置執(zhí)行隔離策略,默認(rèn)是使用線程隔離,此處我們配置為THREAD,即線程池隔離。參見:com.netflix.hystrix.HystrixCommandProperties中各個(gè)參數(shù)的定義。
     

  6. threadPoolProperties:線程池相關(guān)參數(shù)設(shè)置,具體可以設(shè)置哪些參數(shù)請(qǐng)見:com.netflix.hystrix.HystrixThreadPoolProperties
     

  7. ignoreExceptions:調(diào)用服務(wù)時(shí),除了HystrixBadRequestException之外,其他@HystrixCommand修飾的函數(shù)拋出的異常均會(huì)被Hystrix認(rèn)為命令執(zhí)行失敗而觸發(fā)服務(wù)降級(jí)的處理邏輯(調(diào)用fallbackMethod指定的回調(diào)函數(shù)),所以當(dāng)需要在命令執(zhí)行中拋出不觸發(fā)降級(jí)的異常時(shí)來(lái)使用它,通過這個(gè)參數(shù)指定,哪些異常拋出時(shí)不觸發(fā)降級(jí)(不去調(diào)用fallbackMethod),而是將異常向上拋出。
     

  8. observableExecutionMode:定義hystrix observable command的模式;
     

  9. raiseHystrixExceptions:任何不可忽略的異常都包含在HystrixRuntimeException中;
     

  10. defaultFallback:默認(rèn)的回調(diào)函數(shù),該函數(shù)的函數(shù)體不能有入?yún)?,返回值類型與@HystrixCommand修飾的函數(shù)體的返回值一致。如果指定了fallbackMethod,則fallbackMethod優(yōu)先級(jí)更高。

給個(gè)例子:

@HystrixCommand(commandKey = "testCommand", groupKey = "testGroup", threadPoolKey = "testThreadKey",
            fallbackMethod = "hiConsumerFallBack", ignoreExceptions = {NullPointerException.class},
            threadPoolProperties = {
                    @HystrixProperty(name = "coreSize", value = "30"),
                    @HystrixProperty(name = "maxQueueSize", value = "101"),
                    @HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
                    @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
                    @HystrixProperty(name = "metrics.rollingStats.numBuckets", value = "12"),
                    @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "1440")
            }
            )

到此,關(guān)于“怎么理解Spring Cloud Hystrix熔斷”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


本文題目:怎么理解SpringCloudHystrix熔斷
分享URL:http://www.dlmjj.cn/article/pgeocg.html