java架構(gòu)師高端課微服務(wù)_05_SpringCloud_Netflix_Hystrix
主要內(nèi)容
Hystrix簡(jiǎn)介
服務(wù)降級(jí)
服務(wù)熔斷
請(qǐng)求緩存
Feign的雪崩處理
可視化的數(shù)據(jù)監(jiān)控Hystrix-dashboard
學(xué)習(xí)目標(biāo)

一、?Hystrix簡(jiǎn)介
1?什么是災(zāi)難性雪崩效應(yīng)

造成災(zāi)難性雪崩效應(yīng)的原因,可以簡(jiǎn)單歸結(jié)為下述三種:
服務(wù)提供者不可用。如:硬件故障、程序BUG、緩存擊穿、并發(fā)請(qǐng)求量過(guò)大等。
重試加大流量。如:用戶重試、代碼重試邏輯等。
服務(wù)調(diào)用者不可用。如:同步請(qǐng)求阻塞造成的資源耗盡等。
雪崩效應(yīng)最終的結(jié)果就是:服務(wù)鏈條中的某一個(gè)服務(wù)不可用,導(dǎo)致一系列的服務(wù)不可用,最終造成服務(wù)邏輯崩潰。這種問(wèn)題造成的后果,往往是無(wú)法預(yù)料的。
解決災(zāi)難性雪崩效應(yīng)的方式通常有:降級(jí)、熔斷和請(qǐng)求緩存。
2??什么是Hystrix
Hystrix?[h?st'r?ks],中文含義是豪豬,因其背上長(zhǎng)滿棘刺,從而擁有了自我保護(hù)的能力。本文所說(shuō)的Hystrix是Netflix開(kāi)源的一款容錯(cuò)框架,同樣具有自我保護(hù)能力。為了實(shí)現(xiàn)容錯(cuò)和自我保護(hù),下面我們看看Hystrix如何設(shè)計(jì)和實(shí)現(xiàn)的。
Hystrix設(shè)計(jì)目標(biāo):
1、?對(duì)來(lái)自依賴的延遲和故障進(jìn)行防護(hù)和控制——這些依賴通常都是通過(guò)網(wǎng)絡(luò)訪問(wèn)的
2、?阻止故障的連鎖反應(yīng)
3、?快速失敗并迅速恢復(fù)
4、?回退并優(yōu)雅降級(jí)
5、?提供近實(shí)時(shí)的監(jiān)控與告警
Hystrix遵循的設(shè)計(jì)原則:
1、?防止任何單獨(dú)的依賴耗盡資源(線程)
2、?過(guò)載立即切斷并快速失敗,防止排隊(duì)
3、?盡可能提供回退以保護(hù)用戶免受故障
4、?使用隔離技術(shù)(例如隔板,泳道和斷路器模式)來(lái)限制任何一個(gè)依賴的影響
5、?通過(guò)近實(shí)時(shí)的指標(biāo),監(jiān)控和告警,確保故障被及時(shí)發(fā)現(xiàn)
6、?通過(guò)動(dòng)態(tài)修改配置屬性,確保故障及時(shí)恢復(fù)
7、?防止整個(gè)依賴客戶端執(zhí)行失敗,而不僅僅是網(wǎng)絡(luò)通信
Hystrix如何實(shí)現(xiàn)這些設(shè)計(jì)目標(biāo)?
1、?使用命令模式將所有對(duì)外部服務(wù)(或依賴關(guān)系)的調(diào)用包裝在HystrixCommand或HystrixObservableCommand對(duì)象中,并將該對(duì)象放在單獨(dú)的線程中執(zhí)行;
2、?每個(gè)依賴都維護(hù)著一個(gè)線程池(或信號(hào)量),線程池被耗盡則拒絕請(qǐng)求(而不是讓請(qǐng)求排隊(duì))。
3、?記錄請(qǐng)求成功,失敗,超時(shí)和線程拒絕。
4、?服務(wù)錯(cuò)誤百分比超過(guò)了閾值,熔斷器開(kāi)關(guān)自動(dòng)打開(kāi),一段時(shí)間內(nèi)停止對(duì)該服務(wù)的所有請(qǐng)求。
5、?請(qǐng)求失敗,被拒絕,超時(shí)或熔斷時(shí)執(zhí)行降級(jí)邏輯。
6、?近實(shí)時(shí)地監(jiān)控指標(biāo)和配置的修改。
?
在Spring cloud中處理服務(wù)雪崩效應(yīng),都需要依賴hystrix組件。在Application Client應(yīng)用的pom文件中都需要引入下述依賴:

二、?服務(wù)降級(jí)
降級(jí)是指,當(dāng)請(qǐng)求超時(shí)、資源不足等情況發(fā)生時(shí)進(jìn)行服務(wù)降級(jí)處理,不調(diào)用真實(shí)服務(wù)邏輯,而是使用快速失敗(fallback)方式直接返回一個(gè)托底數(shù)據(jù),保證服務(wù)鏈條的完整,避免服務(wù)雪崩。
解決服務(wù)雪崩效應(yīng),都是避免application client請(qǐng)求application service時(shí),出現(xiàn)服務(wù)調(diào)用錯(cuò)誤或網(wǎng)絡(luò)問(wèn)題。處理手法都是在application client中實(shí)現(xiàn)。我們需要在application client相關(guān)工程中導(dǎo)入hystrix依賴信息。并在對(duì)應(yīng)的啟動(dòng)類(lèi)上增加新的注解@EnableCircuitBreaker,這個(gè)注解是用于開(kāi)啟hystrix熔斷器的,簡(jiǎn)言之,就是讓代碼中的hystrix相關(guān)注解生效。
具體實(shí)現(xiàn)過(guò)程如下:
1?修改application service代碼
修改application service工程中的代碼,模擬超時(shí)錯(cuò)誤。此模擬中,讓服務(wù)端代碼返回之前休眠2000毫秒,替代具體的復(fù)雜服務(wù)邏輯。


2??application client POM依賴

3??application client容錯(cuò)處理代碼




4??application client配置文件application.yml

5??application client啟動(dòng)類(lèi)

三、?服務(wù)熔斷
當(dāng)一定時(shí)間內(nèi),異常請(qǐng)求比例(請(qǐng)求超時(shí)、網(wǎng)絡(luò)故障、服務(wù)異常等)達(dá)到閥值時(shí),啟動(dòng)熔斷器,熔斷器一旦啟動(dòng),則會(huì)停止調(diào)用具體服務(wù)邏輯,通過(guò)fallback快速返回托底數(shù)據(jù),保證服務(wù)鏈的完整。
熔斷有自動(dòng)恢復(fù)機(jī)制,如:當(dāng)熔斷器啟動(dòng)后,每隔5秒,嘗試將新的請(qǐng)求發(fā)送給服務(wù)提供者,如果服務(wù)可正常執(zhí)行并返回結(jié)果,則關(guān)閉熔斷器,服務(wù)恢復(fù)。如果仍舊調(diào)用失敗,則繼續(xù)返回托底數(shù)據(jù),熔斷器持續(xù)開(kāi)啟狀態(tài)。

具體實(shí)現(xiàn)過(guò)程如下:
1?application client POM依賴


2??application client容錯(cuò)處理代碼



3??application client配置文件application.yml

4??application client啟動(dòng)類(lèi)


四、?請(qǐng)求緩存
請(qǐng)求緩存:通常意義上說(shuō),就是將同樣的GET請(qǐng)求結(jié)果緩存起來(lái),使用緩存機(jī)制(如redis、mongodb)提升請(qǐng)求響應(yīng)效率。
使用請(qǐng)求緩存時(shí),需要注意非冪等性操作對(duì)緩存數(shù)據(jù)的影響。
請(qǐng)求緩存是依托某一緩存服務(wù)來(lái)實(shí)現(xiàn)的。在案例中使用redis作為緩存服務(wù)器,那么可以使用spring-data-redis來(lái)實(shí)現(xiàn)redis的訪問(wèn)操作。
1?修改application service代碼


2??application client POM依賴


3??application client 容錯(cuò)處理代碼







5??application client 啟動(dòng)類(lèi)

五、?Openfeign的雪崩處理
在聲明式遠(yuǎn)程服務(wù)調(diào)用Openfeign中,實(shí)現(xiàn)服務(wù)災(zāi)難性雪崩效應(yīng)處理也是通過(guò)Hystrix實(shí)現(xiàn)的。而feign啟動(dòng)器spring-cloud-starter-openfeign中是包含Hystrix相關(guān)依賴的。如果只使用服務(wù)降級(jí)功能不需要做獨(dú)立依賴。如果需要使用Hystrix其他服務(wù)容錯(cuò)能力,需要依賴spring-cloud-starter-netflix-hystrix資源。從Dalston版本后,feign默認(rèn)關(guān)閉Hystrix支持。所以必須在全局配置文件中開(kāi)啟feign技術(shù)中的Hystrix支持。具體實(shí)現(xiàn)如下:
1?服務(wù)降級(jí)
1.1?POM依賴
Openfeign的啟動(dòng)器依賴spring-cloud-starter-openfeign中,自帶Hystrix處理相關(guān)依賴,所以不需要修改POM依賴,直接通過(guò)配置即可開(kāi)啟容錯(cuò)處理機(jī)制。
1.1?application client 接口

1.3?application client 接口實(shí)現(xiàn)



1.4?application client 配置文件application.yml
