|
熱點(diǎn)參數(shù)限流指的是,在流控規(guī)則中指定對(duì)某參數(shù)的 QPS,當(dāng)所有對(duì)該資源的請(qǐng)求 URL中攜帶有指定參數(shù)的請(qǐng)求QPS 達(dá)到了閾值,則發(fā)生限流。 復(fù)制 consumer-nacos-sentinel-degrade 工程,重命名為 consumer-paramflow。在PetsController處理器中添加如下兩個(gè)方法: /**
* 熱點(diǎn)參數(shù)限流 * @param id * @param name * @return
*/
@GetMapping("/complux")
@SentinelResource(value = "paramFlowRule", fallback = "getCompluxFallback")
public String getCompluxHandle(Integer id, String name) {
return "complux : " + id + " , " + name;
}
//降級(jí)處理方法
public String getCompluxFallback(Integer id, String name) {
return "complux Fallback : " + id + " , " + name;
}12345678910111213復(fù)制代碼類(lèi)型:[java]在啟動(dòng)了消費(fèi)者工程后,再設(shè)置 Sentinel 控制臺(tái)。 參數(shù)例外項(xiàng)參數(shù)例外項(xiàng)是指,對(duì)于熱點(diǎn)參數(shù)中某個(gè)或某些特殊值單獨(dú)設(shè)置規(guī)則。參數(shù)類(lèi)型僅支持基本數(shù)據(jù)類(lèi)型或其對(duì)應(yīng)的包裝類(lèi)型,及String類(lèi)型。 直接在consumer-paramflow工程上進(jìn)行修改,在啟動(dòng)類(lèi)中添加如下代碼: 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;
// 配置開(kāi)啟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);
}
//配置熱點(diǎn)參數(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ù)流控對(duì)象
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復(fù)制代碼類(lèi)型:[java]系統(tǒng)自適應(yīng)限流Sentinel 系統(tǒng)自適應(yīng)限流對(duì)應(yīng)用級(jí)別入口流量進(jìn)行整體控制,結(jié)合應(yīng)用的 Load、CPU 使用率、平均RT、入口 QPS 和入口并發(fā)線(xiàn)程數(shù)等幾個(gè)維度的監(jiān)控指標(biāo),通過(guò)自適應(yīng)的流控策略,讓系統(tǒng)的入口流量和系統(tǒng)的負(fù)載達(dá)到一個(gè)平衡,讓系統(tǒng)盡可能跑在最大吞吐量的同時(shí)保證系統(tǒng)整體的穩(wěn)定性。由于該限流方式中閾值的設(shè)置需要很多系統(tǒng)軟硬件相關(guān)的數(shù)據(jù),而與代碼關(guān)系不大,所以這種限流方式一般是由運(yùn)維來(lái)設(shè)置的。 系統(tǒng)規(guī)則目前支持五種模式: 系統(tǒng)負(fù)載 Load該模式僅對(duì)Linux/Unix-like 系統(tǒng)生效。當(dāng)系統(tǒng) CPU 最近一分鐘的負(fù)載量load1 超過(guò)了設(shè)置的閾值時(shí)會(huì)觸發(fā)系統(tǒng)保護(hù),即對(duì)再來(lái)的請(qǐng)求進(jìn)行限流處理。這個(gè)閾值就是系統(tǒng)負(fù)載容量,系統(tǒng)容量可以由maxQps *minRt 估算得出。不過(guò),也可以通過(guò) CPU cores * 2.5 計(jì)算出其參考數(shù)值。 CPU 使用率當(dāng)系統(tǒng) CPU 使用率超過(guò)閾值即觸發(fā)系統(tǒng)保護(hù)(取值范圍 0.0-1.0),比較靈敏。 平均響應(yīng)時(shí)間 RT當(dāng)對(duì)當(dāng)前應(yīng)用上所有入口流量的平均RT 達(dá)到閾值時(shí)觸發(fā)系統(tǒng)保護(hù),單位是毫秒。 并發(fā)線(xiàn)程數(shù)當(dāng)對(duì)當(dāng)前應(yīng)用的所有入口流量進(jìn)行處理的所有線(xiàn)程數(shù)量達(dá)到閾值時(shí)觸發(fā)系統(tǒng)保護(hù)。 入口 QPS當(dāng)對(duì)當(dāng)前應(yīng)用的所有入口流量的總 QPS 達(dá)到閾值時(shí)觸發(fā)系統(tǒng)保護(hù)。 gitee: https:///javainfamily/spring-cloud-alibaba |
|
|
來(lái)自: 碼農(nóng)9527 > 《Java》