鏈路模式:只針對從指定鏈路訪問到本資源的請求做統計,判斷是否超過閾值。
例如有兩條請求鏈路:
/test1 /common
/test2 /common
如果只希望統計從/test2進入到/common的請求,對/test2 進行限流,則可以這樣配置:
案例:流控模式-鏈路
需求:有查詢訂單和創建訂單業務,兩者都需要查詢商品。針對從查詢訂單進入到查詢商品的請求統計,並設置限流。
步驟:
1.在OrderService中添加一個queryGoods方法,不用實現業務
2.在OrderController中,改造/order/query端點,調用OrderService中的queryGoods方法(/order/query -> queryGoods)
3.在OrderController中添加一個/order/save的端點,調用OrderService的queryGoods方法(/order/save -> queryGoods)
4.給queryGoods設置限流規則,從/order/query進入queryGoods的方法限制QPS必須小於2(設置/order/query qqs<2)
Sentinel默認只標記Controller中的方法為資源,如果要標記其它方法,需要利用@SentinelResource注解,示例:
@SentinelResource("goods") public void queryGoods(){ System.err.println("查詢商品"); }
Sentinel默認會將Controller方法做context整合,導致鏈路模式的流控失效,需要修改application.yml,添加配置:
spring: cloud: sentinel: transport: dashboard: localhost:8080 # sentinel控制台地址 web-context-unify: false # 關閉context整合
訪問/order/query、/order/save資源
http://localhost:8088/order/query ##觸發鏈路限流
http://localhost:8088/order/save ##不會觸發鏈路限流
設置限流規則
流控模式有哪些?
1.直接:對當前資源限流
2.關聯:高優先級資源觸發閾值,對低優先級資源限流。
3.鏈路:閾值統計時,只統計從指定資源進入當前資源的請求,是對請求來源的限流