什么是服務雪崩矢空?
多個微服務之間調用的時候航罗,假設微服務A調用微服務B和微服務C,微服務B和微服務C又調用其它的微服務屁药,這就是所謂的 “扇出”粥血。如果扇出的鏈路上某個微服務的調用響應時間過長或者不可用,對微服務A的調用就會占用越來越多的系統(tǒng)資源酿箭,進而引起系統(tǒng)崩潰复亏,所謂的”雪崩效應“。
對于高流量的應用來說缭嫡,單一的后端依賴可能會導致所有服務器上的所有資源都在幾秒鐘內飽和缔御。比失敗更糟糕的是,這些應用程序還可能導致服務之間的延遲增加妇蛀,備份隊列耕突,線程和其他系統(tǒng)資源緊張笤成,導致整個系統(tǒng)發(fā)生更多的級聯(lián)故障。這些都表示需要對故障和延遲進行隔離和管理眷茁,以便單個依賴關系的失敗炕泳,不能取消整個應用程序或系統(tǒng)。
所以通常當發(fā)現(xiàn)某個模塊下的某個實例失敗后上祈,這時候這個模塊依然還會接收流量培遵,然后這個有問題的模塊還調用了其他的模塊,這樣就會發(fā)生級聯(lián)故障雇逞,或者叫雪崩荤懂。
1.1.Hystrix是干嘛的
Hystrix是一個用于處理分布式系統(tǒng)的延遲和容錯的一個開源庫,在分布式系統(tǒng)里塘砸,許多依賴不可避免的會調用失敗节仿,比如超時、異常等掉蔬,Hystrix能保證在一個依賴出現(xiàn)問題的情況下廊宪,不會導致整體服務失敗,避免級聯(lián)故障女轿,以提高分布式系統(tǒng)的穩(wěn)定性箭启。“斷路器”本身是一種開關裝置,當某個服務單元發(fā)生故障之后蛉迹,通過斷路器的故障監(jiān)控(類似熔斷保險絲)傅寡,向調用方返回一個符合預期的,可處理的備選響應北救,而不是長時間等待或者拋出調用方無法處理的異常荐操,這樣就保證了服務調用方的線程不會被長時間、不必要的占用珍策,從而避免了故障在分布式系統(tǒng)中的蔓延托启,乃至雪崩。
1.2.服務降級(Fallback)
1.2.1什么是服務降級
假設對方系統(tǒng)不可用了攘宙,向調用方返回一個符合預期的屯耸,可備選的響應。服務器忙蹭劈,請稍后重試疗绣,不讓客戶等待并立刻返回一個友好的提示,這就是服務降級铺韧。就像if( ){ }else if{}....有備選方案持痰。再比如給10086打電話,客服繁忙...
出現(xiàn)服務降級的情況:
- ①程序運行異常祟蚀;
- ②超時工窍;
- ③服務熔斷觸發(fā)服務降級;
- ④線程池/信號量打滿也會導致服務降級前酿。
1.2.2進行服務降級的情況
用jmeter進行壓力測試培漏,開啟20000個線程進行測試良漱,測試服務端8001環(huán)境下的兩個地址,結果發(fā)現(xiàn)不僅壓測訪問的地址變慢,同一微服務下的另一個地址訪問也變慢了涌矢,假設客戶端80訪問,一定會更慢正卧,那樣客戶端一定會很不滿意碴倾。那就來試一下,讓客戶端訪問:8001同一層次的其它接口服務被困死(20000個線程訪問)平窘,因為tomcat線程池里面的工作線程已經被擠占完畢吓肋,80此時調用8001,客戶端訪問響應會變慢瑰艘,轉圈圈是鬼。正是因為這些故障和不佳表現(xiàn),才有我們的降級紫新、容錯均蜜、限流等技術的產生。
解決要求:
- 超時導致服務器變慢(轉圈):超時不再等待芒率;
- 出錯(宕機或程序運行出錯):出錯要有兜底囤耳。
1.2.3解決方案
對方服務(8001)超時了,調用者(80)不能一直卡死等待偶芍,必須有服務降級充择;對方服務(8001)宕機了,調用者(80)不能一直卡死等待腋寨,必須服務降級聪铺;對方服務(8001)OK(可能),調用者(80)自己出故障或有自我要求(自己的等待時間小于服務提供者)萄窜,自己處理降級铃剔。
1.2.4如何啟用服務降級
①服務端做降級:首先在業(yè)務類中加入新的配置標簽@HystrixCommand,相當于在fallbackMethod中添加一個方法查刻,如下value設置為3s键兜,當超過3秒時,就會調用備用的方法穗泵,或者是方法中運行錯誤普气,比如說是以下的10/0報錯。
②然后在主啟動類中加入@EnableCircuitBreaker佃延,這樣就可以在服務提供端測試自己的服務降級了
而一般Hystrix服務降級fallback是放在客戶端的现诀,步驟如下:
①首先在yml加上hystrix和feign的配置
②在主啟動類中添加注解@EnableHystrix
③在業(yè)務類中利用Hystrix實現(xiàn)服務降級就行了夷磕,跟服務提供端類似。在這里消費者端的服務降級時間設置的是1.5秒仔沿,而上面服務端設置的時間是3s坐桩,加入服務端線程運行時間實際花費了2秒,在客戶端照樣會發(fā)生服務降級封锉,而以下10/0在會直接進行降級绵跷。
上面的方法是利用openfeign直接調用服務端提供的方法。是前面學習過的成福。
1.2.5設置全局通用服務降級方法
目前存在的問題碾局,每個業(yè)務方法都會有一個兜底的方法,會導致代碼膨脹奴艾,可以設置一個全局通用的服務降級兜底的方法净当,如果需要特殊配置的在另外配。需要加入一個新的注解:DefaultProperties(defaultFallback=" ")統(tǒng)一跳轉到處理結果頁面握侧。這樣可以使得代碼量大大減少蚯瞧。首先在類上加上新的注解,其他的方法沒有設置fallback屬性的話品擎,就會進入全局fallback方法埋合。
就像這樣,下面的方法只添加了@HystricCommand注解萄传,如果出現(xiàn)異常就會進入payment_global_fallback兜底方法甚颂。
1.2.6通配服務降級
目前來看,耦合度太高秀菱,在controller中要聲明很多兜底的方法以備用振诬,可以從源頭來解決這個問題,在這里使用的feign調用的服務端提供的方法衍菱,可以直接在這個調用類里進行解決赶么,如下:寫一個fallback的類直接實現(xiàn)這個接口,一旦這個接口中的某個方法出現(xiàn)了問題脊串,會直接調用實現(xiàn)類中的方法辫呻。如果發(fā)生運行、超時琼锋、宕機異常都會導致降級放闺,而下面的paymentinfo_OK在其他地方沒有配置降級方法,如果8001宕機缕坎,一定會調用下面實現(xiàn)類的paymentinfo_OK方法怖侦。
1.3服務熔斷(break)
類似保險絲達到最大服務訪問時,直接拒絕訪問,拉閘限電匾寝,然后調用服務降級的方法并返回友好提示搬葬。斷路器就相當于是保險絲。
熔斷機制的描述:熔斷機制是應對雪崩效應的一種微服務鏈路保護機制旗吁,當扇出鏈路某個微服務出錯不可用或者響應時間太長時踩萎,會進行服務降級,進而熔斷該節(jié)點微服務的調用很钓,快速返回錯誤信息。當檢測到該節(jié)點微服務調用響應正常后董栽,恢復調用鏈路码倦。熔斷機制通過Hystrix實現(xiàn),Hystrix會監(jiān)控微服務間的調用的狀況锭碳,當失敗的調用到一定的閾值袁稽,缺省是5秒內20次調用失敗,就會啟動熔斷機制擒抛,熔斷機制的注解是@HystrixCommand推汽。
斷路器三個重要參數(shù):快照時間窗、請求總數(shù)閾值歧沪、錯誤百分比閾值
1歹撒、快照時間窗:
斷路器確定是否打開需要統(tǒng)計一些請求和錯誤數(shù)據(jù),而統(tǒng)計的時間范圍就是快照時間窗诊胞,默認為最近的10s暖夭。
2、請求總數(shù)閾值:
在快照時間窗內撵孤,必須滿足請求總數(shù)閾值才有資格熔斷迈着,默認為20,意味著在10s內邪码,如果該hystrix命令的調用次數(shù)不足20次裕菠,即使所有的請求都超時或其他原因失敗,斷路器都不會打開闭专。
3奴潘、錯誤百分比閾值:
當請求總數(shù)在快照時間窗內超過了閾值,比如發(fā)生了30次調用喻圃,如果在這30次調用中萤彩,有15次發(fā)生了超時異常,也就是超過50%的錯誤百分比斧拍,在默認設置50%閾值的情況下雀扶,這時候就會將斷路器打開。
如以下所示,仍然還是在HystrixCommand注解中進行配置愚墓,在上面加了四個Hystrix新的屬性配置予权,意思就是在10s的窗口期內,發(fā)送十次請求浪册,假如說有60%也就是6次都失敗了扫腺,就激活斷路器。而當他斷路器激活以后村象,所有的請求都無法處理了笆环,而過一段時間之后,斷路器又會嘗試著讓少量的請求通過一下(也就是斷路器進入了half-open狀態(tài))厚者,而如果請求仍然失敗躁劣,斷路器又會重新回到open狀態(tài),如果請求成功库菲,斷路器則會關閉账忘。也就是鏈路恢復。
在controller中寫出響應的調用熙宇,然后進行訪問鳖擒,如果十次中有六次及以上是負數(shù),會發(fā)現(xiàn)烫止,第11次時就算是正數(shù)仍然會進入fallback方法蒋荚,因為此時進行了服務熔斷。
1.4服務限流:(flowlimit)
秒殺高并發(fā)的操作烈拒,嚴禁一窩蜂的過來擁擠圆裕,大家排隊,一秒鐘N個荆几,有序的進行吓妆。
1.5 Hystrix工作流程總結
1.6 接近實時的監(jiān)控
Hystrix還提供了準實時的調用監(jiān)控(Hystrix Dashboard),Hystrix會持續(xù)的記錄所有通過Hystrix發(fā)起的請求的執(zhí)行信息吨铸,并以統(tǒng)計報表和圖形的形式展示給用戶行拢,包括每秒執(zhí)行多少請求,多少成功诞吱,多少失敗等舟奠。Netflix通過hystrix-metrics-event-stream項目實現(xiàn)了對以上指標的監(jiān)控。Spring Cloud也提供了Hystrix Dashboard的整合房维,對監(jiān)控內容轉化成可視化界面沼瘫。
1.6.1搭建流程
①首選創(chuàng)建一個新的module,導入pom咙俩,主要是spring-cloud-starter-netflix-hystrix-dashboard
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
注意還有一個依賴耿戚,這個依賴如果是要進行圖形化展示是一定要有的湿故,一般和web同時存在
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
②然后配置yml
暫且配置一個端口號就夠用了
③主啟動類,注意添加了一個新的注解:@EnableHystrixDashboard膜蛔,一般要用一個新的功能坛猪,就要添加新的注解
④:最后訪問localhost://9001/hystrix就可以顯示了
1.6.2進一步配置以進行監(jiān)控
Hystrix的服務監(jiān)控需要自己配置,對于傳統(tǒng)的微服務架構一定是夠用了皂股,而spring Cloud Alibaba提供的微服務監(jiān)控可以直接訪問墅茉,在后面會學習到,主要進行sentienl的學習呜呐。