熱點參數(shù)限流指的是,在流控規(guī)則中指定對某參數(shù)的 QPS,當所有對該資源的請求 URL中攜帶有指定參數(shù)的請求QPS 達到了閾值,則發(fā)生限流。 復制 consumer-nacos-sentinel-degrade 工程,重命名為 consumer-paramflow。在PetsController處理器中添加如下兩個方法: /** * 熱點參數(shù)限流 * @param id * @param name * @return */ @GetMapping("/complux") @SentinelResource(value = "paramFlowRule", fallback = "getCompluxFallback") public String getCompluxHandle(Integer id, String name) { return "complux : " + id + " , " + name; } //降級處理方法 public String getCompluxFallback(Integer id, String name) { return "complux Fallback : " + id + " , " + name; }12345678910111213復制代碼類型:[java] 在啟動了消費者工程后,再設(shè)置 Sentinel 控制臺。 參數(shù)例外項參數(shù)例外項是指,對于熱點參數(shù)中某個或某些特殊值單獨設(shè)置規(guī)則。參數(shù)類型僅支持基本數(shù)據(jù)類型或其對應(yīng)的包裝類型,及String類型。 直接在consumer-paramflow工程上進行修改,在啟動類中添加如下代碼: package com.javafamily; import com.alibaba.csp.sentinel.slots.block.RuleConstant; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowItem; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule; import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.openfeign.EnableFeignClients; import java.util.ArrayList; import java.util.List; // 配置開啟feign @EnableFeignClients @SpringBootApplication public class ParamflowConsumerApplication { public static void main(String[] args) { SpringApplication.run(ParamflowConsumerApplication.class, args); initRule(); } // 初始化規(guī)則 public static void initRule() { List<ParamFlowRule> rules = new ArrayList<>(); ParamFlowRule rule = ParamflowConsumerApplication.paramFlowRule(); rules.add(rule); ParamFlowRuleManager.loadRules(rules); } //配置熱點參數(shù)限流 private static ParamFlowRule paramFlowRule() { ParamFlowRule rule = new ParamFlowRule(); rule.setResource("/complux"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); rule.setLimitApp("default"); rule.setCount(2); rule.setParamIdx(1); rule.setDurationInSec(10); List<ParamFlowItem> items = new ArrayList<>(); items.add(nameParamItem("human", 100)); items.add(nameParamItem("administrative", 100)); rule.setParamFlowItemList(items); return rule; } //創(chuàng)建參數(shù)流控對象 private static ParamFlowItem nameParamItem(String paramValue, int count) { ParamFlowItem item = new ParamFlowItem(); item.setClassType(String.class.getName()); item.setObject(String.valueOf(paramValue)); item.setCount(count); return item; } }12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455復制代碼類型:[java] 系統(tǒng)自適應(yīng)限流Sentinel 系統(tǒng)自適應(yīng)限流對應(yīng)用級別入口流量進行整體控制,結(jié)合應(yīng)用的 Load、CPU 使用率、平均RT、入口 QPS 和入口并發(fā)線程數(shù)等幾個維度的監(jiān)控指標,通過自適應(yīng)的流控策略,讓系統(tǒng)的入口流量和系統(tǒng)的負載達到一個平衡,讓系統(tǒng)盡可能跑在最大吞吐量的同時保證系統(tǒng)整體的穩(wěn)定性。由于該限流方式中閾值的設(shè)置需要很多系統(tǒng)軟硬件相關(guān)的數(shù)據(jù),而與代碼關(guān)系不大,所以這種限流方式一般是由運維來設(shè)置的。 系統(tǒng)規(guī)則目前支持五種模式: 系統(tǒng)負載 Load該模式僅對Linux/Unix-like 系統(tǒng)生效。當系統(tǒng) CPU 最近一分鐘的負載量load1 超過了設(shè)置的閾值時會觸發(fā)系統(tǒng)保護,即對再來的請求進行限流處理。這個閾值就是系統(tǒng)負載容量,系統(tǒng)容量可以由maxQps *minRt 估算得出。不過,也可以通過 CPU cores * 2.5 計算出其參考數(shù)值。 CPU 使用率當系統(tǒng) CPU 使用率超過閾值即觸發(fā)系統(tǒng)保護(取值范圍 0.0-1.0),比較靈敏。 平均響應(yīng)時間 RT當對當前應(yīng)用上所有入口流量的平均RT 達到閾值時觸發(fā)系統(tǒng)保護,單位是毫秒。 并發(fā)線程數(shù)當對當前應(yīng)用的所有入口流量進行處理的所有線程數(shù)量達到閾值時觸發(fā)系統(tǒng)保護。 入口 QPS當對當前應(yīng)用的所有入口流量的總 QPS 達到閾值時觸發(fā)系統(tǒng)保護。 gitee: https:///javainfamily/spring-cloud-alibaba |
|
來自: 碼農(nóng)9527 > 《Java》