spring cloud 筆記 |第三章: Hystrix 熔斷器

簡(jiǎn)介

在微服務(wù)架構(gòu)中,存在著多個(gè)微服務(wù),彼此之間可能存在依賴(lài)關(guān)系,當(dāng)某個(gè)單元出現(xiàn)故障或者網(wǎng)絡(luò)不通暢時(shí),就會(huì)因?yàn)橐蕾?lài)關(guān)系形成故障蔓延,最終導(dǎo)致整個(gè)系統(tǒng)癱瘓,相對(duì)于傳統(tǒng)架構(gòu)更加不穩(wěn)定.為了解決這樣的問(wèn)題,產(chǎn)生了熔斷器模式.

熔斷器的作用

當(dāng)某個(gè)微服務(wù)發(fā)生故障時(shí),通過(guò)熔斷器的故障監(jiān)控,向調(diào)用方返回一個(gè)錯(cuò)誤響應(yīng),而不是長(zhǎng)時(shí)間的等待,這樣就不會(huì)使線程因調(diào)用故障服務(wù)被長(zhǎng)時(shí)間占用不釋放,避免了故障在分布式系統(tǒng)中蔓延,造成大面積雪崩效應(yīng).

Hystrix 熔斷器工作原理

服務(wù)端的服務(wù)降級(jí)邏輯會(huì)因 Hystrix命令調(diào)用依賴(lài)服務(wù)超時(shí)而觸發(fā),也就是調(diào)用服務(wù)超時(shí)會(huì)進(jìn)入斷路回調(diào)邏輯處理.

但熔斷器發(fā)揮作用需要滿足熔斷器三個(gè)重要條件:

1.快照時(shí)間窗

熔斷器確定是否打開(kāi)需要統(tǒng)計(jì)一些請(qǐng)求和錯(cuò)誤數(shù)據(jù),統(tǒng)計(jì)的時(shí)間范圍就是快照時(shí)間窗,默認(rèn)最近10秒.

2.請(qǐng)求總數(shù)下限

在快照時(shí)間窗內(nèi),必須滿足請(qǐng)求總數(shù)下限才有資格熔斷.默認(rèn)為20次,如果說(shuō)10秒內(nèi)調(diào)用次數(shù)不足20次,即是請(qǐng)求服務(wù)超時(shí),斷路也不會(huì)打開(kāi).

3.錯(cuò)誤百分比下限

當(dāng)請(qǐng)求總數(shù)滿足要求,但是錯(cuò)誤率沒(méi)有超過(guò)下限也不會(huì)熔斷.默認(rèn)50%.

因此,熔斷器打開(kāi)的條件是:在10秒快照時(shí)間窗期內(nèi),至少調(diào)用20次服務(wù),并且服務(wù)調(diào)用錯(cuò)誤率超過(guò)50%,才會(huì)打開(kāi)熔斷器.

不滿足以上條件熔斷器不會(huì)打開(kāi),服務(wù)調(diào)用錯(cuò)誤只會(huì)觸發(fā)服務(wù)降級(jí),也就是調(diào)用fallback函數(shù).每個(gè)請(qǐng)求時(shí)間延遲就是近似hystrix的超時(shí)時(shí)間.如果請(qǐng)求時(shí)間超過(guò)設(shè)定超時(shí)時(shí)間后就會(huì)返回fallback.當(dāng)滿足上面條件斷路器打開(kāi),之后再請(qǐng)求調(diào)用的時(shí)候?qū)⒉辉僬{(diào)用處理邏輯,而是直接調(diào)用降級(jí)邏輯,會(huì)直接返回fallback,不在等待是否超時(shí).通過(guò)斷路器實(shí)現(xiàn)自動(dòng)發(fā)現(xiàn)錯(cuò)誤并將降級(jí)邏輯切換為主邏輯,減少響應(yīng)延遲的效果.

在熔斷器打開(kāi)后,處理邏輯并沒(méi)有結(jié)束.當(dāng)熔斷器打開(kāi),對(duì)處理邏輯進(jìn)行熔斷之后,hystrix會(huì)給處理邏輯設(shè)置一個(gè)休眠時(shí)間窗,在這個(gè)時(shí)間窗內(nèi),降級(jí)邏輯為臨時(shí)的主邏輯,當(dāng)休眠時(shí)間窗結(jié)束,熔斷器會(huì)釋放一次請(qǐng)求到處理邏輯,如果此次請(qǐng)求正常返回,那么熔斷器閉合,處理邏輯回復(fù)正常工作;如果此次請(qǐng)求依然有溫蒂,熔斷器重新設(shè)置一個(gè)休眠時(shí)間窗.

通過(guò)以上機(jī)制,hystrix 熔斷器實(shí)現(xiàn)了對(duì)依賴(lài)資源故障的處理,對(duì)降級(jí)策略的主動(dòng)切換及對(duì)處理邏輯的主動(dòng)恢復(fù).這使得我們的微服務(wù)在依賴(lài)外部服務(wù)或資源的時(shí)候得到了非常好的保護(hù),同時(shí)對(duì)于一些具備降級(jí)邏輯的業(yè)務(wù)需求可以實(shí)現(xiàn)自動(dòng)化的切換和恢復(fù),相比于設(shè)置開(kāi)關(guān)由監(jiān)控和運(yùn)維來(lái)進(jìn)行切換的傳統(tǒng)實(shí)現(xiàn)方式顯得更為智能和高效.

代碼實(shí)現(xiàn)

實(shí)現(xiàn)原理圖

image

準(zhǔn)備工作

繼續(xù)上一章筆記的工程,啟動(dòng)eureka-server 工程;啟動(dòng)service-hello工程;

創(chuàng)建Hystrix 熔斷器

改造ribbon-server工程代碼, 在其pom文件中加入hystrix的maven依賴(lài):

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

在程序的啟動(dòng)類(lèi)ServiceRibbonApplication 加@EnableHystrix注解開(kāi)啟Hystrix:

@EnableDiscoveryClient
@EnableEurekaClient
@SpringBootApplication
@EnableHystrix
public class ServiceRibbonApplication {

    public static void main(String[] args) {
        SpringApplication.run( ServiceRibbonApplication.class, args );
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

改造HelloService類(lèi),在helloService方法上加上@HystrixCommand注解。該注解對(duì)該方法創(chuàng)建了熔斷器的功能,并指定了fallbackMethod熔斷方法,熔斷方法直接返回了一個(gè)字符串;

@Service
public class HelloService {
    @Autowired
    RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "helloError")
    public String helloService() {
        return restTemplate.getForObject("http://SERVICE-HELLO/hello",String.class);
    }

    public String helloError() {
        return "sorry,I'm error!";
    }

}

啟動(dòng):service-ribbon 工程,當(dāng)我們?cè)L問(wèn)http://localhost:8084/hello 瀏覽器顯示:

hello ! 我是 8083號(hào)服務(wù)器.

此時(shí)關(guān)閉 service-hello 工程,來(lái)模仿服務(wù)故障,再訪問(wèn)http://localhost:8084/hello 瀏覽器顯示:

sorry,I'm error!

這就說(shuō)明當(dāng) service-hello 服務(wù)不可用的時(shí)候,service-ribbon調(diào)用 service-hello的API接口,會(huì)執(zhí)行快速失敗,直接返回異常方法,而不是等待響應(yīng)超時(shí),這很好的控制了容器的線程阻塞。

最后編輯于
?著作權(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ù)。

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