自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SpringCloud Alibaba Sentinel 限流詳解

開發(fā) 前端
什么是熱點(diǎn)規(guī)則?熱點(diǎn)我們很好理解,就是很火的東西在程序中可以理解成頻繁訪問的數(shù)據(jù),那么有時(shí)候我們系統(tǒng)通緝你某個(gè)熱點(diǎn)數(shù)據(jù)中訪問頻次最高的 前幾個(gè)數(shù)據(jù)對(duì)其進(jìn)行限制訪問。

熔斷規(guī)則

在上一篇文章中我們講解了流控規(guī)則的使用和介紹??Sentinel流控規(guī)則??,今天我們給大家講解sentinel更多樣化的講解以及流量控制。

官方文檔:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html

在面對(duì)調(diào)用鏈路中不穩(wěn)定的資源如何保證高可用?在微服務(wù)中一個(gè)服務(wù)通常會(huì)調(diào)用其他的模塊,可能是服務(wù)內(nèi)的某個(gè)應(yīng)用也有可能是另外的一個(gè)遠(yuǎn)程服務(wù),數(shù)據(jù)庫(kù)或者其他API調(diào)用。比如我們?cè)谥Ц兜臅r(shí)候會(huì)調(diào)用(某付寶、某信、某聯(lián))提供的API,在查詢訂單我們會(huì)調(diào)用數(shù)據(jù)庫(kù)連接,這些依賴的服務(wù)有可能會(huì)存在系統(tǒng)不穩(wěn)定的情況,如果依賴的服務(wù)出現(xiàn)了不穩(wěn)定的情況,請(qǐng)求響應(yīng)時(shí)間過長(zhǎng),線程資源產(chǎn)生堆積,可能最終會(huì)耗盡服務(wù)的資源,導(dǎo)致服務(wù)變的不可用,這個(gè)時(shí)候熔斷降級(jí)是保證服務(wù)高可用的重要措施之一。

圖片

如今的微服務(wù)都是分布式,有很多服務(wù)組成,不同服務(wù)之間互相調(diào)用,有著比較復(fù)雜的調(diào)用鏈路,在上面我們只是模擬繪畫了支付操作,在實(shí)際的鏈路調(diào)用過程中會(huì)有著放大效果,如果某一環(huán)不穩(wěn)定,可能會(huì)形成蝴蝶效應(yīng)最終導(dǎo)致整個(gè)鏈路響應(yīng)時(shí)間過長(zhǎng),甚至不可用,所以如果當(dāng)我們的服務(wù)出現(xiàn) 不穩(wěn)定且沒有強(qiáng)依賴服務(wù)調(diào)用的時(shí),可以進(jìn)行熔斷降級(jí),暫時(shí)限制不穩(wěn)定的調(diào)用,避免影響整體服務(wù)。

圖片

熔斷策略:

sentinel提供了三種熔斷策略:

圖片

  • 慢調(diào)用比例: 選擇以慢調(diào)用比例作為閾值,需要設(shè)置允許的慢調(diào)用RT(最大響應(yīng)時(shí)間),如果請(qǐng)求響應(yīng)時(shí)間大于該值則認(rèn)為慢調(diào)用,當(dāng)統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi)請(qǐng)求數(shù)大于最小請(qǐng)求數(shù),且慢調(diào)用比例大于閾值,在熔斷時(shí)長(zhǎng)內(nèi)的請(qǐng)求會(huì)被自動(dòng)熔斷,超過熔斷時(shí)長(zhǎng)進(jìn)入半恢復(fù)狀態(tài)(HALF_OPEN),如果下一個(gè)請(qǐng)求響應(yīng)時(shí)間小于慢調(diào)用比例RT結(jié)束熔斷,否則再次熔斷。
  • 異常比例: 當(dāng)統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi)請(qǐng)求數(shù)大于最小請(qǐng)求數(shù),且異常比例大于設(shè)定的閾值,在熔斷時(shí)間內(nèi)請(qǐng)求自動(dòng)熔斷,超過熔斷時(shí)長(zhǎng)進(jìn)入半恢復(fù)狀態(tài)(HALF_OPEN),如果下一個(gè)請(qǐng)求成功,結(jié)束熔斷,否則再次熔斷,異常比例閾值范圍(0.0-1.0)代表百分比。
  • 異常數(shù): 當(dāng)統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi)異常數(shù)大于閾值,自動(dòng)進(jìn)行熔斷,超過熔斷時(shí)長(zhǎng)進(jìn)入半恢復(fù)狀態(tài)(HALF_OPEN),如果下一個(gè)請(qǐng)求成功,結(jié)束熔斷,否則再次熔斷。

熔斷狀態(tài):

熔斷狀態(tài)

說明

OPEN

熔斷開啟,拒絕所有請(qǐng)求

HALF_OPEN

熔斷半開啟(恢復(fù)狀態(tài)),如果接下來請(qǐng)求成功結(jié)束熔斷,否則繼續(xù)熔斷

CLOSE

熔斷關(guān)閉,請(qǐng)求通過

熱點(diǎn)參數(shù)規(guī)則的核心屬性:

屬性(Field)

說明

默認(rèn)值

resource

資源名(規(guī)則的作用對(duì)象 ) 必填


grade

熔斷策略(支持慢調(diào)用比例/異常比例/異常數(shù)策略) 必填

慢調(diào)用比例

count

慢調(diào)用比例模式下為慢調(diào)用臨界 RT(超出該值計(jì)為慢調(diào)用);異常比例/異常數(shù)模式下為對(duì)應(yīng)的閾值


timeWindow

熔斷時(shí)長(zhǎng),單位為 s


minRequestAmount

熔斷觸發(fā)的最小請(qǐng)求數(shù),請(qǐng)求數(shù)小于該值時(shí)即使異常比率超出閾值也不會(huì)熔斷(1.7.0 引入)

5

statIntervalMs

統(tǒng)計(jì)時(shí)長(zhǎng)(單位為 ms),如 60*1000 代表分鐘級(jí)(1.8.0 引入)

1000 ms


slowRatioThreshold

慢調(diào)用比例閾值,僅慢調(diào)用比例模式有效(1.8.0 引入)


熔斷策略 - 慢調(diào)用比例

選擇以慢調(diào)用比例作為閾值,需要設(shè)置允許的慢調(diào)用RT(最大響應(yīng)時(shí)間),如果請(qǐng)求響應(yīng)時(shí)間大于該值則認(rèn)為慢調(diào)用,當(dāng)統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi)請(qǐng)求數(shù)大于最小請(qǐng)求數(shù),且慢調(diào)用比例大于閾值,在熔斷時(shí)長(zhǎng)內(nèi)的請(qǐng)求會(huì)被自動(dòng)熔斷,超過熔斷時(shí)長(zhǎng)進(jìn)入半恢復(fù)狀態(tài)(HALF_OPEN),如果下一個(gè)請(qǐng)求響應(yīng)時(shí)間 小于慢調(diào)用比例RT結(jié)束熔斷,否則再次熔斷。

圖片

如果我們一秒鐘請(qǐng)求的數(shù)量大于5且RT(最大響應(yīng)時(shí)間)大于我們?cè)O(shè)置的比例閾值的時(shí)候,觸發(fā)熔斷策略,比如我們有8個(gè)請(qǐng)求在一秒中進(jìn)來,有5個(gè)慢調(diào)用,比例閾值設(shè)置為0.1,這個(gè)時(shí)候我們滿足(QPS > 5 且 RT > 比例閾值),進(jìn)入下一步熔斷策略,觸發(fā)熔斷器。

熔斷器的內(nèi)部使用的是斷路器,這個(gè)好比我們做核酸,本來一棟一棟下去做,如果服務(wù)或者檢測(cè)機(jī)器蹦了,通知你暫時(shí)不要下來,當(dāng)機(jī)器恢復(fù)了,再通知你下來做,這個(gè)就類似我們的斷路器。

圖片

案例演示:

@GetMapping("/fuse")
public String fuse(){
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello fuse";
}

設(shè)置我們的熔斷策略,如果QPS>5請(qǐng)求RT>250且大于比例閾值觸發(fā)熔斷。

圖片

通過JMeter測(cè)試,1秒鐘發(fā)起10個(gè)線程請(qǐng)求,此時(shí)就會(huì)觸發(fā)熔斷效果,停止測(cè)試以后,10秒鐘恢復(fù)正常。

圖片

當(dāng)我們啟動(dòng)線程之后,再去訪問fuse接口,可以看到被熔斷了,那么當(dāng)我們停止線程之后,十秒之后去訪問,就可以正常訪問。

圖片

熔斷策略 - 異常比例

當(dāng)統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi)請(qǐng)求數(shù)大于最小請(qǐng)求數(shù),且異常比例大于設(shè)定的閾值,在熔斷時(shí)間內(nèi)請(qǐng)求自動(dòng)熔斷,超過熔斷時(shí)長(zhǎng)進(jìn)入半恢復(fù)狀態(tài)(HALF_OPEN),如果下一個(gè)請(qǐng)求成功,結(jié)束熔斷,否則再次熔斷,異常比例閾值范圍(0.0-1.0)代表百分比。異常降級(jí)僅僅只針對(duì)業(yè)務(wù)異常,對(duì)于sentinel本身的異常不生效。

圖片

測(cè)試:

@GetMapping("/exptoin")
public String exptoin(Integer id){
if(id != null && id > 1){
throw new RuntimeException("異常比例測(cè)試");
}
return "exptoin test";
}

圖片

接下來我們用JMeter進(jìn)行測(cè)試,設(shè)置Http請(qǐng)求地址:http://localhost:8006/exptoin?id=5當(dāng)啟動(dòng)JMeter的時(shí)候,會(huì)觸發(fā)熔斷,這個(gè)時(shí)候我們1秒鐘發(fā)送10個(gè)請(qǐng)求超過了最小請(qǐng)求數(shù),同事超過了閾值,滿足兩個(gè)條件,當(dāng)熔斷時(shí)間結(jié)束 以后恢復(fù)正常。

圖片

熔斷策略 - 異常數(shù)

當(dāng)統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi)異常數(shù)大于閾值,自動(dòng)進(jìn)行熔斷,超過熔斷時(shí)長(zhǎng)進(jìn)入半恢復(fù)狀態(tài)(HALF_OPEN),如果下一個(gè)請(qǐng)求成功,結(jié)束熔斷,否則再次熔斷。

圖片

測(cè)試代碼:

@GetMapping("/exptoin/num")
public String exptoinNum(Integer id){
if(id != null && id > 1){
throw new RuntimeException("異常數(shù)測(cè)試");
}
return "exptoinNum test";
}

設(shè)置異常數(shù)策略,當(dāng)1秒鐘內(nèi)請(qǐng)求超過5并且異常數(shù)大約5個(gè)的時(shí)候觸發(fā)熔斷。

圖片

圖片

圖片

熱點(diǎn)規(guī)則

官網(wǎng)文檔:https://sentinelguard.io/zh-cn/docs/parameter-flow-control.html

什么是熱點(diǎn)規(guī)則?熱點(diǎn)我們很好理解,就是很火的東西在程序中可以理解成頻繁訪問的數(shù)據(jù),那么有時(shí)候我們系統(tǒng)通緝你某個(gè)熱點(diǎn)數(shù)據(jù)中訪問頻次最高的前幾個(gè)數(shù)據(jù)對(duì)其進(jìn)行限制訪問。

例如在秒殺系統(tǒng)中,某一款商品或者某幾款商品,要定點(diǎn)秒殺,我們可以以商品ID為參數(shù),在一定時(shí)間內(nèi)對(duì)其進(jìn)行限流。

又或者如果某一個(gè)用戶頻繁的去訪問我們系統(tǒng),我們也可以針對(duì)于用戶ID或者IP進(jìn)行限制。

熱點(diǎn)規(guī)則會(huì)統(tǒng)計(jì)入?yún)?shù)中的熱點(diǎn)數(shù)據(jù),根據(jù)配置的限流閾值和模式,對(duì)啟動(dòng)的熱點(diǎn)數(shù)據(jù)進(jìn)行限流也就是流量控制。

圖片

在上圖中我們攜帶了是三個(gè)參數(shù)(axb\abc\xs)等,我們?cè)趕entinel中設(shè)置熱點(diǎn)限流,我們?cè)O(shè)置的QPS為5,注意:該模式只支持QPS限制,如果我們的axb參數(shù),命中了我們的規(guī)則,那么該請(qǐng)求攜帶的參數(shù)就會(huì)被限流。

圖片

在使用熱點(diǎn)規(guī)則的時(shí)候,我們需要配合對(duì)應(yīng)的@SentinelResource注解進(jìn)行使用,才能夠達(dá)到更加細(xì)粒度的流控規(guī)則。

@SentinelResource

  • value:代表資源名稱,必填,通過name找到對(duì)應(yīng)的規(guī)則。
  • blockHandler:blockHandler 對(duì)應(yīng)處理 BlockException 的方法名稱,可選項(xiàng),訪問范圍為public,返回類型需要和原方法匹配,并且在最后一需要添加BlockException類型的參數(shù)。

圖片

測(cè)試代碼:

@GetMapping("/hotTest")
@SentinelResource(value = "hotTest")
public String testHotKey(@RequestParam(value = "v1",required = false) String v1,
@RequestParam(value = "v2",required = false)String v2){
return "熱點(diǎn)規(guī)則 - 熱點(diǎn):";
}

圖片

在這里我們要注意,我們需要配置的是不帶斜杠的資源名稱,這個(gè)才是我們需要配置的項(xiàng)目。

圖片

這個(gè)時(shí)候我們傳入?yún)?shù) http://localhost:8006/hotTest?v1,不停的刷新瀏覽器,這個(gè)時(shí)候會(huì)超過閾值,那么下面就會(huì)出現(xiàn)限流。

圖片

但是,這個(gè)報(bào)錯(cuò)信息不是很友好,一般人根本不知道啥意思,我們可以使用@SentinelResource注解提供的另外一個(gè)參數(shù)blockHandler,這個(gè)參數(shù)是可以指定當(dāng)出現(xiàn)異常時(shí)的處理方法,操作如下:

@GetMapping("/hotTest")
@SentinelResource(value = "hotTest",blockHandler = "handler_hot")
public String testHotKey(@RequestParam(value = "v1",required = false) String v1,
@RequestParam(value = "v2",required = false)String v2){

if("5".equals(v1)){
throw new RuntimeException("報(bào)告有bug!!!");
}
return "熱點(diǎn)規(guī)則 - 熱點(diǎn):";
}

//處理異常方法,方法簽名要和對(duì)應(yīng)的接口方法保持一致
public String handler_hot(String v1, String v2, BlockException exception){
return "請(qǐng)求過于頻繁,請(qǐng)稍后再試.....";
}

重新添加熱點(diǎn)規(guī)則后,再去頻繁的去訪問,效果如下:

圖片

例外項(xiàng)數(shù)目:

圖片

熱點(diǎn)規(guī)則除了上述的基礎(chǔ)使用外,還有例外項(xiàng)的操作,例外項(xiàng)參數(shù)可以達(dá)到更加細(xì)粒度的控制,比如我們?cè)诋?dāng)前的案例中,目前v1參數(shù)在訪問時(shí)超過閾值則會(huì)被限流,當(dāng)時(shí)如果我們想通過參數(shù)v1等于具體的值的時(shí)候,來出發(fā)不同的流控效果時(shí),改怎么操作呢?

比如我想要讓v1等于2的時(shí)候,閾值達(dá)到50,其他的規(guī)則走上面的規(guī)則。

圖片

如果當(dāng)前v1的值為2的時(shí)候,會(huì)走例外項(xiàng)里面的設(shè)置,也就是50的閾值,如果不是2會(huì)走普通的閾值規(guī)則,通過下圖我們可以看到如果為2的值,無論我們點(diǎn)擊多少次,都不會(huì)提示我們請(qǐng)求過于頻繁。

圖片

系統(tǒng)規(guī)則

sentinel系統(tǒng)自適應(yīng)限流是從整體維度對(duì)應(yīng)用入口流量進(jìn)行控制,結(jié)合應(yīng)用的load、CPU使用率、總體平均RT、入口QPS和并發(fā)線程數(shù)等幾個(gè)維度的監(jiān)控指標(biāo),通過自適應(yīng)的流控策略,來讓系統(tǒng)入口流量和系統(tǒng)的負(fù)載達(dá)到一個(gè)平衡,讓系統(tǒng)盡可能的在面對(duì)高并發(fā)訪問的同時(shí)保證系統(tǒng)整體的穩(wěn)定。

系統(tǒng)保護(hù)是應(yīng)用整體,所以不具備更細(xì)粒度的操作,只針對(duì)于入口流量有效。

圖片

系統(tǒng)規(guī)則支持的模式:

圖片

  • LOAD自適應(yīng):針對(duì)于linxu/unix 機(jī)器有效,系統(tǒng)load(一分鐘平均負(fù)載)作為啟發(fā)指標(biāo),進(jìn)行自適應(yīng)系統(tǒng)保護(hù)。
  • RT:?jiǎn)闻_(tái)機(jī)器上所有的入口流量平均RT達(dá)到閾值時(shí),觸發(fā)系統(tǒng)保護(hù),單位為毫秒。
  • 線程數(shù):?jiǎn)闻_(tái)機(jī)器上所有入口流量的并發(fā)線程數(shù)達(dá)到閾值觸發(fā)系統(tǒng)保護(hù)。
  • 入口QPS: 單臺(tái)機(jī)器上所有入口流量的QPS達(dá)到閾值觸發(fā)系統(tǒng)保護(hù)。
  • CPU 使用率:當(dāng)系統(tǒng)CPU使用率超過閾值時(shí)觸發(fā)系統(tǒng)保護(hù)(取值范圍:0.0 - 1.0)。

演示:

通過入口QPS來進(jìn)行測(cè)試,直接設(shè)置規(guī)則;

圖片

最后測(cè)試效果不管現(xiàn)在我們?cè)L問那個(gè)接口只要超過閾值就會(huì)被限流。

圖片

總結(jié)

到這里我們限流策略就講完了,其實(shí)并不復(fù)雜,我們需要了解其中每個(gè)規(guī)則如何使用,效果是怎樣的。

責(zé)任編輯:武曉燕 來源: 牧小農(nóng)
相關(guān)推薦

2021-05-21 08:30:26

Sentinel GateWay 微服務(wù)

2022-05-09 07:35:48

動(dòng)態(tài)集群限流

2021-05-14 07:45:07

Sentinel 接口限流

2024-09-06 13:53:28

2024-11-05 15:02:41

2021-03-16 08:31:59

微服務(wù)Sentinel雪崩效應(yīng)

2020-08-03 08:04:04

限流算法Sentinel

2021-03-26 06:01:45

日志MongoDB存儲(chǔ)

2023-11-08 07:45:47

Spring微服務(wù)

2023-04-26 09:16:17

2022-08-29 06:27:15

Nacos微服務(wù)

2025-04-17 02:00:00

2021-11-04 10:11:02

Sentinel網(wǎng)關(guān)限流

2024-02-04 10:08:34

2022-05-03 19:38:15

限流微服務(wù)Sentinel

2025-04-08 09:20:00

Sentinel限流微服務(wù)

2023-09-18 14:39:02

2024-12-25 15:44:15

2021-05-17 07:50:06

流控規(guī)則Sentinel
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)