擴展sentinel之區分來源

1.簡介

在sentinel的流控規則,與授權規則中,都提供了來源區分。

比如流控規則:這裏的針對來源,表示針對哪些調用來源進行限流

  • 默認值default表示不區分來源,即任何調用來源都限流

  • 如果需要指定來源進行限流,比如說調用端有:app、pc

  • 針對app調用要限流,針對pc調用不限流,該如何實現呢?

  • 需要注意:sentinel默認是隻認default,其它不認識!!!

比如授權規則:這裏流控應用,表示針對哪些應用調用需要授權,或者禁止

  • 配合選擇白名單,表示流控應用中指定的應用,允許訪問

  • 配合選擇黑名單,表示流控應用中指定的應用,不允許訪問

  • 需要注意:sentinel默認是不提供來源區分,因此授權規則默認情況下用不了

  • 那如果需要使用授權規則,該如何實現呢?

2.擴展RequestOriginParser

要想實現流控規則中的針對來源,以及授權規則中指定流控應用。sentinel給我們提供了一個接口

public interface RequestOriginParser {
    String parseOrigin(HttpServletRequest var1);
}

我們只需要擴展RequestOriginParser接口,即可實現區分來源的業務場景需求,要實現區分來源,得有來源標識,這裏我有兩個建議

  • http請求參數中,傳遞來源標識

  • http請求頭中,傳遞來源標識

在實際項目中,我建議從http請求頭中,傳遞來源標識,這樣會讓請求更加優雅一些!放到請求參數中,會使得請求參數稍微難堪!比如這樣的:http://ip:port/shop/add?origin=app,非要加【?origin=app】這一段來傳遞來源標識,醜陋,非常醜陋!

但是在我的這個案例中,爲了演示方便,我還是選擇醜陋的方式了,小夥伴們諒解諒解!

@Component
public class MyRequestOriginParser implements RequestOriginParser {

    /**
     * 解析來源
     * @param request
     * @return
     */
    public String parseOrigin(HttpServletRequest request) {
        // 1.這裏從請求參數中獲取origin(實際應用中,建議從http請求頭獲取更佳!)
        String origin = request.getParameter("origin");

        return origin;
    }
}

3.測試效果

啓動應用,分別測試流控規則針對來源,以及授權規則,看看效果吧!

3.1.流控規則

配置流控規則,指定流控規則來源app

訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=app,瘋狂刷新,流控了!

訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,瘋狂刷新,沒有發生流控!

3.2.授權規則

配置授權規則,指定流控應用:app,並選擇白名單,表示只允許app端訪問

訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=app,可以正常訪問!

訪問端點:http://127.0.0.1:8080/sentinel/grade/1?origin=pc,禁止訪問,提示沒有授權!

{"status":500,"msg":"error,沒有訪問權限!"}

提前友情提示:原計劃我們下一篇要分享【擴展sentinel之支持restful url】,因在sentinel新的版本中,已經支持了restful 風格url,那麼該篇文章我們就省略了。

有小夥伴可能會有疑問,什麼是restful風格url?

 

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