1.引入Sentinel jar包:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.4.1</version>
</dependency>
流量控制(Flow Control),原理是監控應用流量的QPS或并發線程數等名額,當達到指定門檻值時對流量進行控制,避免系統被瞬時的流量高峰沖垮,保障應用高可用性。
2.定義所有限流規則的集合List<FlowRule>,啟動時需要加載該令牌,并将規則增加到令牌桶
public void initFlowQpsRule() {
List<FlowRule> rules = new ArrayList<FlowRule>();
FlowRule rule1 = new FlowRule();
rule1.setResource("getOrderInfo");//定義要保護的資源
// QPS控制在2以内
rule1.setCount(2);
// QPS限流
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);
}
3.Sentinel切面類配置:
@Configuration
public class SentinelAspectConfiguration {
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
}
4.
/**
* 訂單查詢接口, 使用Sentinel注解實作限流
*
* @param orderId
* @return
*/
@SentinelResource(value = "getOrderInfo", blockHandler = "handleFlowQpsException",
fallback = "queryOrderInfo2Fallback")
public String queryOrderInfo2(String orderId) {
// 模拟接口運作時抛出代碼異常
if ("000".equals(orderId)) {
throw new RuntimeException();
}
System.out.println("擷取訂單資訊:" + orderId);
return "return OrderInfo :" + orderId;
}
/**
* 訂單查詢接口抛出限流或降級時的處理邏輯(阻塞時調用的方法)
*
* 注意: 方法參數、傳回值要與原函數保持一緻 ,參數一定要有BlockException,其它的參數和原參數一緻
* @return
*/
public String handleFlowQpsException(String orderId, BlockException e) {
e.printStackTrace();
return "handleFlowQpsException for queryOrderInfo2: " + orderId;
}
/**
* 訂單查詢接口運作時抛出的異常提供fallback處理
*
* 注意: 方法參數、傳回值要與原函數保持一緻
* @return
*/
public String queryOrderInfo2Fallback(String orderId, Throwable e) {
return "fallback queryOrderInfo2: " + orderId;
}
一般value 的命名規則為類名.方法名
參考文章:https://blog.csdn.net/noaman_wgs/article/details/103328793