天天看點

springcloud 限流 之 微服務之間的調用

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 的命名規則為類名.方法名

springcloud 限流 之 微服務之間的調用

參考文章:https://blog.csdn.net/noaman_wgs/article/details/103328793

繼續閱讀