Spring Cloud Alibaba 教程(基於首個畢業版)(七):SentinelAPI 詳解

本篇博客將爲大家介紹SentinelAPI

 

1. SphU(官方文檔

1.1 概念

SphU 包含了 try-catch 風格的 API。用這種方式,當資源發生了限流之後會拋出 BlockException。這個時候可以捕捉異常,進行限流之後的邏輯處理。

1.2 示例

第一步:在TestController 新建一個方法

@GetMapping("/test-sentinel-api")
    public String testSentinelAPI(@RequestParam(required = false) String a){
        // 定義個sentinel保護的資源,名稱是test-sentinel-api
        Entry entry = null;
        String resourceName = "test-sentinel-api";
        try {
            entry = SphU.entry(resourceName);
            // 被保護的業務邏輯
            if (StringUtils.isBlank(a)){
                throw new IllegalArgumentException("a is empty");
            }
            return a;
            // 如果被保護的資源被限流或者降級了,就會拋BlockException異常
        } catch (BlockException e) {
            log.warn("限流,或者降級了",e);
            return "限流,或者降級了";
        } finally {
            if (entry != null){
                // 退出entry
                entry.exit();
            }
        }
    }

第二步:在瀏覽器請求一直請求接口

  • 若請求的接口地址帶參數,則一直返回
  • 若請求的接口地址不帶參數,則一直報IllegalArgumentException異常

第三步:添加流控規則
選擇QPS,單機閾值爲1
此時如果進行頻繁的請求超過閾值怎接口返回

限流,或者降級了

2. 業務異常統計 Tracer (官方文檔

2.1 概念

業務異常記錄類 Tracer 用於記錄業務異常

2.2 示例

第一步:修改方法

@GetMapping("/test-sentinel-api")
    public String testSentinelAPI(@RequestParam(required = false) String a){
        // 定義個sentinel保護的資源,名稱是test-sentinel-api
        Entry entry = null;
        String resourceName = "test-sentinel-api";
        try {
            entry = SphU.entry(resourceName);
            // 被保護的業務邏輯
            if (StringUtils.isBlank(a)){
                throw new IllegalArgumentException("a is empty");
            }
            return a;
            // 如果被保護的資源被限流或者降級了,就會拋BlockException異常
        } catch (BlockException e) {
            log.warn("限流,或者降級了",e);
            return "限流,或者降級了";
        }catch (IllegalArgumentException e2){
            // 統計IllegalArgumentException 次數、佔比等等
            Tracer.trace(e2);
            return "參數非法";
        }finally {
            if (entry != null){
                // 退出entry
                entry.exit();
            }
        }
    }

第二步: 添加降級規則
爲資源名test-sentinel-api 添加降級規則
降級策略:異常比例
異常比例:0.1 
時間窗口:1
第三步:多次不帶參數進行接口請求
返回:參數非法

3. 上下文工具類 ContextUtil(官方文檔

3.1 示例

第一步:修改代碼

@GetMapping("/test-sentinel-api")
    public String testSentinelAPI(@RequestParam(required = false) String a){
        // 定義個sentinel保護的資源,名稱是test-sentinel-api
        Entry entry = null;
        String resourceName = "test-sentinel-api";
        ContextUtil.enter(resourceName,"test-wfw");
        try {
            entry = SphU.entry(resourceName);
            // 被保護的業務邏輯
            if (StringUtils.isBlank(a)){
                throw new IllegalArgumentException("a is empty");
            }
            return a;
            // 如果被保護的資源被限流或者降級了,就會拋BlockException異常
        } catch (BlockException e) {
            log.warn("限流,或者降級了",e);
            return "限流,或者降級了";
        } catch (IllegalArgumentException e2){
            // 統計IllegalArgumentException 次數、佔比等等
            Tracer.trace(e2);
            return "參數非法";
        } finally {
            if (entry != null){
                // 退出entry
                entry.exit();
            }
            ContextUtil.exit();
        }
    }


第二步:添加規則
針對資源名:test-sentinel-api添加規則
針對來源:test-wfw
閾值類型:QPS
單機閾值:1
第三步:快速請求接口
返回:限流,或者降級了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章