之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷( 二 )

我們將原有的select方法的返回值從原來的List<Person>升級為SelectPersonVo , 后者在前者原有基礎上擴展了一個error字段,用于返回異常信息
接著是本節的關鍵:select方法新增@SentinelResource注解,我們前邊講過:Sentinel根據對應資源配置的規則來為資源執行相應的流控/降級/系統保護策略
因此這個注解的作用是——用于標明這是一個Sentinel系統中的資源

value代表這個資源的名稱是person/select,這個名字可以隨自己的習慣自定義
blockHandler指定了一個方法,這個方法在Sentinel系統觸發某種規則的時候會被執行,關于“某種規則”我們稍后會講
這里指定的selectBlock方法,在定義時是有硬性要求的:
1. 保留select方法一樣的參數,外加一個BlockException參數
2. 返回值必須和select方法相同 —— 所以明白為什么要額外定義一個SelectRetVo了吧?
控制臺的使用我們像上一節一樣,分別啟動provider和consumer,然后刷新Sentinel控制臺頁面
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
看到這個界面的時候,你是否有種豁然開朗的感覺?
因為consumer中定義了Sentinel資源,所以當dubbo-nacos-consumer工程執行之后,控制臺會有相關顯示
而功能菜單中有N多項的名稱都是XX規則,這也就是前邊我們定義的blockHandler對應的某種規則
我們在post中調用consumer中的select方法 , 此時實時監控頁面顯示如下內容:
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
這里的person/select自然就是我們定義的【資源】 , 控制臺配套顯示了其各項指標數據 , 很直觀也很方便
下邊還有一項/person/select(開頭多個/) , 這個又是什么?這里先直接告訴大家答案——Sentinel默認會將所有Controller添加請求映射的方法視為資源
那我們額外添加一個@SentinelResource注解是否多此一舉?答案是否,因為Controller生成的默認Sentinel資源是不帶自定義規則觸發方法的
因此@SentinelResource依然是有必要的,待本篇內容結束之后 , 大家可以自行驗證這個說法
而從第二項【簇點鏈路】中,我們也能看到person/select和/person/select本身具備從屬關系
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
流控規則第三項【流控規則】對應了本節標題中提到的【限流】
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
這里涉及到三個概念:
閾值類型
QPS —— 服務器每秒接受的最大請求數
線程數 —— 服務器能容忍的最大線程占用數,一般用于保護服務器的業務線程池不被耗盡
流控模式
直接 —— 默認項 , 接口到達限流要求時,規則直接生效
關聯 —— 當關聯在資源到達閾值時,直接限流自己,一般應用于效率讓步的訴求
鏈路 —— 記錄鏈路流量,當入口資源到達閾值 , 則限流自己
流控效果
快速失敗 —— 默認項,超出閾值后新請求直接拒絕
排隊等待 —— 讓請求勻速通過(漏桶算法),每個請求在一個允許的延遲時長范圍內
Warm up —— 冷啟動模式 , 防止流量瞬間暴增直接將服務壓垮,而是逐漸外放請求上限
我們先按圖所示創建一個最簡單的限流規則 —— QPS閾值為1,直接快速失敗
而后我們啟動兩個post,同時向服務器端發送select請求,則結果對比如下:
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
 
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
由于QPS指定的閾值為1,因此同時發起的第二個請求會因觸發限流規則而執行blockHandler方法
而我們針對 閾值類型、流控模式、流控效果 這三個指標交叉組合,可以創造出適用于各種服務器場景之下的限流規則
再比如我們按如下設置限流規則
之八 2流高手速成記:基于Sentinel實現微服務體系下的限流與熔斷

文章插圖
這種設置方式代表我們所能允許select方法同時請求的上限值為2000,但是這個數值是在5分鐘(300秒)之間逐步放開的,比如我們用這種模式可以應對類似雙11期間大力度優惠而帶來的突發流量洪峰
通過【限流】可以很好的起到保護服務器的作用 , 在特殊時期針對流量進行削峰填谷,使得服務器處在一個長期穩定的環境

推薦閱讀