青島旅游網(wǎng)站建設(shè)徐州seo排名公司
Sentinel也就是我們之前的Hystrix,而且比Hystrix功能更加的強(qiáng)大。Sentinel是分布式系統(tǒng)的流量防衛(wèi)兵,以流量為切入點,從流量控制、流量路由、熔斷降級等多個維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel采用的是懶加載,這個接口被訪問一次,才會被Sentinel監(jiān)測到加到簇點鏈路中。
1.流控規(guī)則
閾值類型:
QPS設(shè)置的是每秒的請求數(shù)達(dá)到一定閾值,是將請求攔在外面判斷處理的。
并發(fā)線程數(shù)設(shè)置的是后臺處理請求的線程數(shù)量,是將請求都放進(jìn)來判斷處理的。
1.1流控模式
1.1.1流控模式——直接
哪個接口配置了就直接對此接口生效即可,沒什么好說的。
1.1.2流控模式——關(guān)聯(lián)
當(dāng)關(guān)聯(lián)的資源(接口)達(dá)到閾值時,就限流自己,比如配置的資源為testA,關(guān)聯(lián)的資源為testB,如果說testB達(dá)到閾值了,testA就會被限流。實際的運用場景就是訂單調(diào)用支付服務(wù),如果支付服務(wù)過載了,那么限流一下訂單服務(wù)就會比較好,能緩解很大的壓力。
1.1.3流控模式——鏈路
多個不同的請求調(diào)用同一個接口時,接口可以配置統(tǒng)計從某個入口資源的請求訪問數(shù)量,如果超額,則此接口限流,整個鏈路就相當(dāng)于斷了。
1.2流控效果
1.2.1快速失敗
超過閾值直接失敗,返回Blocked by Sentinel (flow limiting)
1.2.2預(yù)熱
當(dāng)突然有多個請求同時過來時,可采用預(yù)熱。預(yù)熱中有一個冷因子默認(rèn)為3,此時如果我們配置的單機(jī)閾值為10,預(yù)熱時長為5,表明剛開始的請求最大限度為10/3=3,超過則會快速失敗,需要慢慢預(yù)熱,等到5s之后,才會升至穩(wěn)定的閾值10。
Sentinel也就是我們之前的Hystrix,而且比Hystrix功能更加的強(qiáng)大。Sentinel是分布式系統(tǒng)的流量防衛(wèi)兵,以流量為切入點,從流量控制、流量路由、熔斷降級等多個維度保護(hù)服務(wù)的穩(wěn)定性。
Sentinel采用的是懶加載,這個接口被訪問一次,才會被Sentinel監(jiān)測到加到簇點鏈路中。
1.2.3排隊等待
????????閾值類型必須設(shè)置為QPS,否則無效,我們設(shè)置單機(jī)閾值為1,超時時間為20000ms,意思時每一秒只能處理一個請求,多余請求的不會丟棄,而是去排隊等待,等待的超時時間為20000ms。
2.降級規(guī)則
這里演示的是通過哪些方式可以發(fā)生熔斷來觸發(fā)sentinel自帶的降級。
注意:Sentinel的斷路器是沒有半開的狀態(tài)的。
2.1RT
????????RT是指平均響應(yīng)時間,當(dāng)1s(統(tǒng)計時長)內(nèi)涌入超過5個請求(最小請求數(shù)),如果對應(yīng)的響應(yīng)時間超過了設(shè)置的閾值(最大RT),熔斷器打開,那么在接下來的時間窗口(熔斷時長)內(nèi),對這個接口的調(diào)用都會觸發(fā)降級返回,窗口時間過去后,熔斷器就會自動關(guān)閉。
2.2異常比例
????????當(dāng)1s內(nèi)(統(tǒng)計時長)涌入超過5個請求(最小請求數(shù)),并且每秒的異常比例超過閾值(比例閾值)之后,就會進(jìn)入熔斷,在接下來的時間窗口內(nèi),對這個方法的調(diào)用會直接降級返回。如果不滿足熔斷條件,普通調(diào)用如果出異常直接報錯。
2.3異常數(shù)
????????當(dāng)1分鐘內(nèi)(統(tǒng)計時長)涌入超過5個請求(最小請求數(shù)),并且1分鐘內(nèi)的異常次數(shù)超過閾值(異常數(shù))之后,就會進(jìn)入熔斷,在接下來的時間窗口內(nèi),對這個方法的調(diào)用會直接降級返回。如果不滿足熔斷條件,普通調(diào)用如果出異常直接報錯。
3.Sentinel熱點key配置
@SentinelResource注解就是我們之前使用的@HystrixCommand方法,基本相似。
雖然我們經(jīng)常訪問的是同一個接口,比如查詢接口,但是由于查詢的數(shù)據(jù)不同,傳入的參數(shù)也就不同,所以我們可以將一些熱門的鍵和參數(shù)值進(jìn)行限流配置,用blockHandler來定義限流訪問時我們自己的兜底方法,但是注意這個兜底方法與之前Hystrix中方法中出現(xiàn)的超時、異常等等的兜底方法不一樣,它只負(fù)責(zé)熱點的限流兜底,Hystrix那個得用fallback~~。
fallback管運行異常,blockHandler管配置違規(guī)。
3.1普通的鍵情況
3.2特例情況
我們期望第一個參數(shù)如果為某個特殊值比如5時,它的限流和平常的不一樣,閾值可以達(dá)到200。
4.系統(tǒng)規(guī)則
????????系統(tǒng)規(guī)則是整體維度的,而不是細(xì)分為資源維度,僅對入口流量生效,入口流量指的是進(jìn)入應(yīng)用的流量。相當(dāng)于在最外層做了保護(hù)。
5.@SentinelResource注解說明
如果我們使用了@SentinelResource注解,并給value附上了值,如下:
訪問此接口后,sentinel控制臺會有兩個資源名,如下:
?
????????此時注意,如果我們給byUrl添加流控,就表明我們要使用自定義的兜底方法,但是我們并沒有用blockHandler定義該有的兜底方法,那么如果限流了sentinel不會使用自己默認(rèn)自帶的,會返回error錯誤信息。
????????如果我們給/rateLimit/byUrl添加流控,如果限流了sentinel會使用自己默認(rèn)自帶的。
我們現(xiàn)在的兜底方案面臨的問題:
1.系統(tǒng)默認(rèn)的,沒有體現(xiàn)我們自己的業(yè)務(wù)要求。
2.依照現(xiàn)有條件,我們自定義的處理方法又和業(yè)務(wù)代碼耦合在一塊,不直觀。
3.每個業(yè)務(wù)方法都添加一個兜底的,那代碼膨脹加劇。
4.全局統(tǒng)一的處理方法沒有體現(xiàn)。
????????我們可以創(chuàng)建CustomerBlockHandler類用于自定義限流處理邏輯,將所有的限流兜底方法都定義在一起,外面直接引用即可。如下所示:
6.服務(wù)熔斷
6.1服務(wù)熔斷只配置fallback
注意:這里的兜底方法返回值和原方法的返回值類型必須一致。
6.2服務(wù)熔斷只配置blockHandler
注意:如果沒有觸發(fā)sentinel配置規(guī)則,但方法內(nèi)部出現(xiàn)了異常,此處直接會報錯,返回給前臺error錯誤信息,對用戶不友好。
6.3fallback和blockHandler都配置
????????各自找各自的,雙劍合璧,威力大增。若 blockHandler 和 fallback 都進(jìn)行了配置,則被限流降級而拋出 BlockException 時只會進(jìn)入 blockHandler 處理邏輯。
6.4exceptionsToIgnore
????????表示忽略異常,比如配置了exceptionsToIgnore = {IllegalArgumentException.class},就算配置了fallback兜底方法,如果方法出現(xiàn)了IllegalArgumentException異常,不會走兜底方法,而是直接返回error錯誤信息。
6.5服務(wù)熔斷OpenFeign
還是以前的那一套,直接使用即可。
7.規(guī)則持久化
????????像我們之前在Sentinel中配置的規(guī)則,如果服務(wù)關(guān)閉或者重啟,其規(guī)則都沒有了,這樣肯定是不行的,所以我們可以把規(guī)則配置到Nacos中,讓Sentinel去和Nacos共享,這樣就達(dá)到了服務(wù)的匹配規(guī)則持久化。
-
resource:資源名稱;
-
limitApp:來源應(yīng)用;
-
grade:閾值類型,0表示線程數(shù),1表示QPS;
-
count:單機(jī)閾值;
-
strategy:流控模式,0表示直接,1表示關(guān)聯(lián),2表示鏈路;
-
controlBehavior:流控效果,0表示快速失敗,1表示W(wǎng)arm Up,2表示排隊等待;
-
clusterMode:是否集群
8.Hystrix和Sentinel比較
Hystrix和Sentinel都是用于服務(wù)容錯的組件,但是Sentinel相比于Hystrix更加的強(qiáng)大。
-
對于熔斷降級:Hystrix是基于異常比率,而Sentinel有平均響應(yīng)時間、異常比率、異常數(shù)。
-
對于流控效果:Hystrix不支持,而Sentinel有快速失敗、預(yù)熱、排隊等待。
-
對于控制臺:Hystrix只是簡單的監(jiān)控查看,而Sentinel控制臺操作簡單,可進(jìn)行多種配置。
?