sentinel初探
背景:
?????? 最近線上系統(tǒng)遇到線程耗盡,導(dǎo)致不能正常辦理業(yè)務(wù)問題。通過分析發(fā)現(xiàn),因?yàn)槠渲袃蓚€(gè)定時(shí)任務(wù)觸發(fā)時(shí)間短,每個(gè)處理耗時(shí)反而很長(zhǎng),線程耗盡,已獲得的線程部分報(bào)沒有提供者,即服務(wù)不可用,同時(shí)導(dǎo)致部分業(yè)務(wù)請(qǐng)求無法獲得線程,業(yè)務(wù)中斷無返回。
?????? 解決此具體問題可以用具體方案,比如將線程數(shù)量調(diào)大,有問題的定時(shí)任務(wù)觸發(fā)時(shí)間調(diào)長(zhǎng)。但是,我們希望避免類似問題再出現(xiàn),因此可以采用熔斷限流組件。比如Netflix的一款開源限流組件Hystrix,作為作為Spring Cloud官方默認(rèn)的熔斷組件,但是已經(jīng)停止維護(hù)。另外一款是18年7月開源的sentinel,行業(yè)應(yīng)用普遍。
? ? ? ?什么是熔斷:個(gè)人理解如果當(dāng)調(diào)用失敗達(dá)到指定的次數(shù),則將熔斷器打開一段時(shí)間,即將請(qǐng)求鏈路斷開;在指定時(shí)間內(nèi),都不再讓消費(fèi)者向提供者發(fā)送請(qǐng)求;當(dāng)熔斷時(shí)間到了,就將熔斷器設(shè)置為半打開的狀態(tài),此時(shí)消費(fèi)者可以往提供者發(fā)送請(qǐng)求,并統(tǒng)計(jì)成功次數(shù),如果達(dá)到指定的成功次數(shù),熔斷器則變?yōu)殛P(guān)閉狀態(tài),即將請(qǐng)求鏈路打開,否則熔斷器又變回打開狀態(tài)。
???????什么是限流:個(gè)人理解限制單位時(shí)間內(nèi)請(qǐng)求數(shù)量,比如每秒只能1個(gè)請(qǐng)求,多余請(qǐng)求直接返回,不會(huì)發(fā)到服務(wù)提供者上去。
?????? 由于系統(tǒng)采用的是dubbo框架,dubbo自帶服務(wù)降級(jí),但是其服務(wù)降級(jí)可理解為將后端報(bào)錯(cuò)包裝成具有業(yè)務(wù)意義的返回,并不帶熔斷。所以盡管每次因?yàn)?RPC 異常而導(dǎo)致調(diào)用失敗,也不會(huì)進(jìn)行熔斷處理;即不管調(diào)用失敗多少次,消費(fèi)者還是會(huì)繼續(xù)進(jìn)行調(diào)用。其實(shí)這樣會(huì)導(dǎo)致服務(wù)的資源浪費(fèi):
?????? 只要服務(wù)提供者出現(xiàn)異常達(dá)到一定的次數(shù),其實(shí)可以理解為服務(wù)提供者短時(shí)間內(nèi)已經(jīng)不能正常提供服務(wù)了,后續(xù)再調(diào)用也是浪費(fèi)資源。當(dāng)出現(xiàn)提供者不可用,消費(fèi)者還會(huì)進(jìn)行 1+retires 次的 RPC 調(diào)用,這樣就更加浪費(fèi)資源了。所以,為 dubbo 配一個(gè)熔斷機(jī)制是非常有必要的了。
?
Sentinel(微服務(wù)的哨兵)簡(jiǎn)介:
?????? 隨著分布式系統(tǒng)變得越來越流行,服務(wù)之間的可靠性變得比以往任何時(shí)候都更加重要。Sentinel以“流量”為切入點(diǎn),在流量控制、?流量整形、熔斷、系統(tǒng)自適應(yīng)保護(hù)等多個(gè)領(lǐng)域開展工作,保障微服務(wù)的可靠性和彈性。哨兵具有以下特點(diǎn):
????豐富的應(yīng)用場(chǎng)景:Sentinel在阿里巴巴已經(jīng)被廣泛使用,幾乎覆蓋了近10年雙11(11.11)購(gòu)物節(jié)的所有核心場(chǎng)景,比如“秒殺”需要限制突發(fā)流量到滿足系統(tǒng)容量、消息削峰填谷、下游不可靠業(yè)務(wù)斷路、集群流量控制等。
????實(shí)時(shí)監(jiān)控:Sentinel 還提供實(shí)時(shí)監(jiān)控能力??梢詫?shí)時(shí)查看單臺(tái)機(jī)器的運(yùn)行時(shí)間信息,以及500個(gè)節(jié)點(diǎn)以下集群的聚合運(yùn)行時(shí)間信息。
????廣泛的開源生態(tài)系統(tǒng):Sentinel 提供與常用框架和庫(kù)(例如 Spring Cloud、Dubbo 和 gRPC)的開箱即用集成。您只需將適配器依賴項(xiàng)添加到?您的服務(wù)即可輕松使用 Sentinel。
????多語(yǔ)言支持:Sentinel 為 Java、Go和C++提供了本機(jī)支持。
????豐富的SPI擴(kuò)展:Sentinel提供簡(jiǎn)單易用的SPI擴(kuò)展接口,可以讓您快速自定義邏輯,例如自定義規(guī)則管理、適配數(shù)據(jù)源等。
????具體可以參考:https://gitee.com/rmlb/Sentinel/
?
Sentinel使用
?????? 本demo使用技術(shù)springboot+dubbo+mybatis-puls+sentinel,工程已上傳github,地址是:https://github.com/zbf2016/springboot-dubbo-sentinel.git
?????? 工程目錄截圖:
????????
?????? dubbo-service:接口模塊,所有需要暴露的接口放此模塊,會(huì)被dubbo-consumer和dubbo-service模塊依賴。
?????? dubbo-common:公共模塊,主要放工具類等。
?????? dubbo-consumer:消費(fèi)者模塊獨(dú)立模塊。
?????? dubbo-provider:服務(wù)提供者獨(dú)立模塊。
?????? sentinel配置放在common模塊,如下:

?????? 服務(wù)提供者接口:

?????? 服務(wù)提供者接口實(shí)現(xiàn)

?????? 消費(fèi)者需要繼承熔斷流控規(guī)則類:

?????? 測(cè)試,服務(wù)提供者不啟動(dòng),模擬100次請(qǐng)求,一秒請(qǐng)求2次

?????? 觀察結(jié)果如下:

?????? 當(dāng)?shù)?次請(qǐng)求,第2次請(qǐng)求,第4次請(qǐng)求,第6次請(qǐng)求都是正常,沒有被限流,也就是符合1QPS的限流規(guī)則,說明sentinel起了限流作用。

?????? 當(dāng)?shù)?0次請(qǐng)求后,所有的請(qǐng)求都被熔斷了,符合熔斷規(guī)則設(shè)置的5秒內(nèi)10個(gè)請(qǐng)求,有2個(gè)異常及以上即熔斷。
??????
Sentinel監(jiān)控
?????? Sentinel監(jiān)控可以直接在github下載jar包,參考github即可,啟動(dòng)后如下所示:

賬號(hào)密碼都是sentinel,初次進(jìn)入是空白

?????? 當(dāng)有請(qǐng)求之后,可在控制界面配置限流規(guī)則和熔斷規(guī)則,目前只在服務(wù)生效期間有用,服務(wù)重啟需要重新配,如需要長(zhǎng)期有效,可以整合nacos即可

?????? 總結(jié):sentinel使用簡(jiǎn)單,功能強(qiáng)大,在微服務(wù)系統(tǒng)中被廣泛使用,讓系統(tǒng)高可用。
