介紹
首先在這里給粉絲道個歉,由于這一段時間比較忙境析,沒有更新大數(shù)據(jù),因為項目上用到了Spring cloud派诬,所以在以后的日子里劳淆,會將Spring cloud納入更新的范疇,好了默赂,言歸正傳沛鸵。
據(jù)我了解,現(xiàn)在市面上比較成熟的分布式框架有兩種缆八,要么采用dubbo曲掰,要么采用Spring cloud疾捍,之前的項目用的是dubbo,之后也會將dubbo的簡單介紹一下栏妖,這里的主角是Spring cloud乱豆,至于他們兩個的區(qū)別,這個網(wǎng)上都有底哥,主要的一點就是如果使用dubbo咙鞍,像這些服務(wù)的降級限流熔斷,監(jiān)控趾徽,鏈路跟蹤等等,只能說自己搞翰守,dubbo沒有集成孵奶,阿里支付寶用的dubbo,淘寶用的Spring cloud蜡峰,在網(wǎng)上找了一個圖了袁,供大家參考
服務(wù)降級限流熔斷
在進入正題之前,有個問題湿颅,分布式系統(tǒng)中肯定會遇到服務(wù)雪崩效應载绿,這個服務(wù)雪崩效應是什么呢?
下面這幅圖可以說明這個問題
商品詳情展示服務(wù)會依賴商品服務(wù)油航, 價格服務(wù)崭庸,商品評論服務(wù),調(diào)用三個依賴服務(wù)會共享商品詳情服務(wù)的線程池怕享,如果其中的商品評論服務(wù)不可用(超時,代碼異常等等), 就會出現(xiàn)線程池里所有線程都因等待響應而被阻塞, 從而造成服務(wù)雪崩镰踏。
概況一下就是:因服務(wù)提供者的不可用導致服務(wù)調(diào)用者的不可用函筋,并將不可用逐漸放大的過程,就叫服務(wù)雪崩效應奠伪,這句話應該很好理解跌帐,就不過多的解釋了。
到這里就知道了雪崩的原因是服務(wù)提供者的不可用導致的绊率,那么什么是導致服務(wù)提供者的不可用呢谨敛?無非就這么幾點:大流量請求(高并發(fā)),提供者硬件問題即舌,緩存擊穿佣盒,程序的bug,超時等等
到這里想想怎么解決顽聂?第一個想到的就是肥惭,重試盯仪,當服務(wù)的提供方不可用時,重試無形中增加了提供方的壓力蜜葱,所以重試不可取全景。
到這里瓶頸了,再想想是不是哪里有問題牵囤,服務(wù)雪崩的根本原因到底是什么爸黄?
應該是:
大量請求線程同步等待造成的資源耗盡
當服務(wù)調(diào)用者使用同步調(diào)用的時候,會產(chǎn)生大量的等待線程占用系統(tǒng)資源揭鳞,一旦線程資源被耗盡炕贵,
服務(wù)調(diào)用者提供的服務(wù)也將處于不可用狀態(tài),于是服務(wù)雪崩效應產(chǎn)生了野崇!
知道了根本原因称开,問題來了,怎么解決呢乓梨?這里才入正題鳖轰,是不是引子有些長?
解決方案
1扶镀,超時機制
2蕴侣,服務(wù)限流
3,服務(wù)熔斷
4臭觉,服務(wù)降級
超時機制
如果我們加入超時機制昆雀,例如2s,那么超過2s就會直接返回了胧谈,那么這樣就在一定程度上可以抑制消費者資源耗盡的問題
服務(wù)限流
通過線程池+隊列的方式忆肾,通過信號量的方式。比如商品評論比較慢菱肖,最大能同時處理10個線程客冈,隊列待處理5個,那么如果同時20個線程到達的話稳强,其中就有5個線程被限流了场仲,其中10個先被執(zhí)行,另外5個在隊列中
服務(wù)熔斷
這個熔斷可以理解為我們自己家里的電閘退疫。
當依賴的服務(wù)有大量超時時渠缕,在讓新的請求去訪問根本沒有意義,只會無畏的消耗現(xiàn)有資源褒繁,比如我們設(shè)置了超時時間為1s亦鳞,如果短時間內(nèi)有大量請求在1s內(nèi)都得不到響應,就意味著這個服務(wù)出現(xiàn)了異常,此時就沒有必要再讓其他的請求去訪問這個服務(wù)了燕差,這個時候就應該使用熔斷器避免資源浪費
服務(wù)降級
有服務(wù)熔斷遭笋,必然要有服務(wù)降級。
所謂降級徒探,就是當某個服務(wù)熔斷之后瓦呼,服務(wù)將不再被調(diào)用,此時客戶端可以自己準備一個本地的fallback(回退)回調(diào)测暗,返回一個缺省值央串。 例如:(備用接口/緩存/mock數(shù)據(jù)),這樣做碗啄,雖然服務(wù)水平下降质和,但好歹可用,比直接掛掉要強稚字,當然這也要看適合的業(yè)務(wù)場景
寫個小demo
git地址:https://github.com/11078334334/hystrix
https://github.com/11078334334/user-service
https://github.com/11078334334/eureka
一定要下載看看代碼
在UserFeignClient類中侦另,需要解釋一下,F(xiàn)eign整合hystrix和ribbon整合hystrix有一些區(qū)別尉共,因為Feign應用比ribbon廣泛,只寫出Feign整合hystrix的demo
1,fallback = FeignClientFallback.class這個來告訴Feign弃锐,如果接口超時袄友,異常,降級方法在哪里霹菊,就在FeignClientFallback這個class類中
2剧蚣,對應的方法就和調(diào)用的方法名完全一致
3,降級方法中最好不要寫過多的業(yè)務(wù)邏輯旋廷,防止降級方法出錯
運行起來之后鸠按,用jmeter進行壓測
1,配置接口
2饶碘,一次性發(fā)起10個并發(fā)目尖,發(fā)起1次
3,執(zhí)行結(jié)果
上面這個是線程池滿的情況扎运,也可以測試服務(wù)提供者宕機的情況瑟曲,也會執(zhí)行降級方法,這里就不再演示豪治。
畫了一下hystrix熔斷器的執(zhí)行過程洞拨,如圖
好了,就到了里负拟,望指正烦衣,不吝賜教