願你生命中有夠多的雲翳,造就一個美好的黃昏
歡迎關注公眾號【渣男小四】,一個喜歡技術更喜歡藝術的青年
一.介紹
熱點即經常訪問的資料。很多時候我們希望統計某個熱點資料中訪問頻次最高的 Top K 資料,並對其訪問進行限制。比如:
商品 ID 為引數,統計一段時間內最常購買的商品 ID 並進行限制
使用者 ID 為引數,針對一段時間內頻繁訪問的使用者 ID 進行限制
熱點引數限流會統計傳入引數中的熱點引數,並根據配置的限流閾值與模式,對包含熱點引數的資源呼叫進行限流。熱點引數限流可以看做是一種特殊的流量控制,僅對包含熱點引數的資源呼叫生效。
Sentinel 利用 LRU 策略統計最近最常訪問的熱點引數,結合令牌桶演算法來進行引數級別的流控。
二.簡單使用
例子:我們需要對攜帶引數為h1的請求進行限流,帶有h1引數的是熱點商品,不過過於頻繁的訪問。
程式碼
商品查詢介面
查詢過於頻繁進行限流的兜底方法,兜底方法需要在上面query介面用blockHandler指定,如果query介面沒有用blockHandler指定,則會返回異常介面,對於前端來說不友好
配置熱點key
資源名為@SentinelResource(value = "query")中value值,引數索引從0開始,如果第一個引數是h1,則遵守響應的熱點規則,單機閾值為1,代表一秒鐘只能處理一個請求,否則進行限流
測試
1.一秒鐘只傳送一次請求
2.一秒鐘多次請求
引數例外項
上面我們只要帶了h1引數,不管h1的值是什麼,違反了熱點規則,都將會限流,但是有些情況我們希望引數的值為某個值時,限流規則不同,也就是說如果h1的值如果為big,我們希望他的QPS能夠達到200。
配置引數例外項
配置過後,如果h1的值為big,則QPS就能達到200
注意:@SentinelResource只處理Sentinel控制檯所配置的異常,而不處理程式的內部錯誤情況,也就是說在Sentinel控制檯配置了相應的規則我才處理,如果程式內部出現了異常情況,則處理不了。
如:
製造程式內部出錯
結果:無法走熱點規則,而是直接報錯。