微服務(wù) 9:?集成Sentinel網(wǎng)關(guān)服務(wù) (限流功能)(文末有項(xiàng)目連接)

文章知識(shí)來(lái)源主要來(lái)源于:趙俊夫先生的博客  以下為原文鏈接
https://blog.csdn.net/u011177064/category_9572944.html
1:什么是服務(wù)限流
我們后端的接口調(diào)用頻次(QPS/TPS)動(dòng)輒上百萬(wàn),甚至達(dá)到千萬(wàn)級(jí)別块蚌,
這對(duì)于服務(wù)端的承受能力是一個(gè)巨大的考驗(yàn)府寒。
那么限流在這個(gè)問(wèn)題中起到什么作用呢?
其實(shí)就是對(duì)于流量進(jìn)行有策略的管理和限制。 比如說(shuō)在一個(gè)系統(tǒng)中氢架,有訂單查詢服務(wù)郭毕,商品查詢服務(wù),積分查詢等刘急,
如果一個(gè)系統(tǒng)能支持的QPS(每秒查詢次數(shù))是100棚菊,那么這100該如何如何分配就是限流功能所考慮的事情。

根據(jù)這些服務(wù)的重要性叔汁,我們可能會(huì)把商品查詢服務(wù)的QPS設(shè)置的比較高统求,
因?yàn)檫@類用戶查詢到商品是有購(gòu)買意向的检碗,而訂單查詢、積分查詢啥的

在用戶訪問(wèn)量過(guò)大時(shí)码邻,我們就能盡量保證有購(gòu)買意向的用戶正常使用系統(tǒng)折剃。
2:什么是Sentinel
在SpringCloud GateWay服務(wù)網(wǎng)關(guān)中集成Sentinel來(lái)實(shí)現(xiàn)服務(wù)的限流功能。
主要以流量為切入點(diǎn)像屋,從流量控制怕犁、熔斷降級(jí)、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性己莺。
3:Pom配置
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>
4:GatewayFlowRule 的字段詳解
網(wǎng)關(guān)限流規(guī)則 GatewayFlowRule 的字段解釋如下:

resource:資源名稱奏甫,可以是網(wǎng)關(guān)中的 route 名稱或者用戶自定義的 API 分組名稱。
resourceMode:
    規(guī)則是針對(duì) API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)
    還是用戶在 Sentinel 中定義的 API 分組(RESOURCE_MODE_CUSTOM_API_NAME)凌受,默認(rèn)是 route阵子。

grade:限流指標(biāo)維度,同限流規(guī)則的 grade 字段胜蛉。
count:限流閾值
intervalSec:統(tǒng)計(jì)時(shí)間窗口挠进,單位是秒,默認(rèn)是 1 秒誊册。

controlBehavior:
     流量整形的控制效果领突,同限流規(guī)則的 controlBehavior 字段,
    目前支持快速失敗和勻速排隊(duì)兩種模式案怯,默認(rèn)是快速失敗攘须。

burst:應(yīng)對(duì)突發(fā)請(qǐng)求時(shí)額外允許的請(qǐng)求數(shù)目。

maxQueueingTimeoutMs:勻速排隊(duì)模式下的最長(zhǎng)排隊(duì)時(shí)間殴泰,單位是毫秒于宙,僅在勻速排隊(duì)模式下生效。

paramItem:參數(shù)限流配置悍汛。
    若不提供捞魁,則代表不針對(duì)參數(shù)進(jìn)行限流,該網(wǎng)關(guān)規(guī)則將會(huì)被轉(zhuǎn)換成普通流控規(guī)則离咐;
    否則會(huì)轉(zhuǎn)換成熱點(diǎn)規(guī)則谱俭。
    其中的字段:
    1:parseStrategy:從請(qǐng)求中提取參數(shù)的策略,目前支持提取來(lái)源 (四種模式)
        1:IP(PARAM_PARSE_STRATEGY_CLIENT_IP)
        2:Host(PARAM_PARSE_STRATEGY_HOST)
        3:任意 Header(PARAM_PARSE_STRATEGY_HEADER)
        4:任意 URL 參數(shù)(PARAM_PARSE_STRATEGY_URL_PARAM)

    2: fieldName:若提取策略選擇 Header 模式或 URL 參數(shù)模式宵蛀,則需要指定對(duì)應(yīng)的 header 名稱或 URL 參數(shù)名稱昆著。

    3:pattern:參數(shù)值的匹配模式,只有匹配該模式的請(qǐng)求屬性值會(huì)納入統(tǒng)計(jì)和流控术陶;若為空則統(tǒng)計(jì)該請(qǐng)求屬性的所有值凑懂。(1.6.2 版本開始支持)

    4: matchStrategy:參數(shù)值的匹配策略支持:
            1:精確匹配(PARAM_MATCH_STRATEGY_EXACT)、
            2:子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)
            3: 正則匹配(PARAM_MATCH_STRATEGY_REGEX)梧宫。(1.6.2 版本開始支持)

加載網(wǎng)關(guān)規(guī)則方式:
    1:用戶可以通過(guò) GatewayRuleManager.loadRules(rules) 手動(dòng)加載網(wǎng)關(guān)規(guī)則接谨,
    2:通過(guò) GatewayRuleManager.register2Property(property) 注冊(cè)動(dòng)態(tài)規(guī)則源動(dòng)態(tài)推送(推薦方式)
5:注入Sentinel配置
 /**
     * 設(shè)置進(jìn)行限流的Api集合
     */
    private void initCustomizedApis() {
        /*
            ApiDefinition:用戶自定義的 API 定義分組摆碉,可以看做是一些 URL 匹配的組合。
            比如我們可以定義一個(gè) API 叫 myGateway脓豪,
            請(qǐng)求 path 模式為
            /nacos-provider/loadBanlance/print  默認(rèn)為準(zhǔn)確的         URL_MATCH_STRATEGY_EXACT
             /nacos-provider/loadBanlance/**    如需/**需要設(shè)置成    URL_MATCH_STRATEGY_PREFIX
             的都?xì)w到 myGateway 這個(gè) API 分組下面巷帝。
         */

        //限流的時(shí)候可以針對(duì)這個(gè)自定義的 API 分組維度進(jìn)行限流。
        Set<ApiDefinition> definitions = new HashSet<>();
        //設(shè)置限流路徑
        ApiDefinition api = new ApiDefinition("myGateway")
                .setPredicateItems(new HashSet<ApiPredicateItem>() {{
                    add(new ApiPathPredicateItem()
//                            .setPattern("/nacos-provider/loadBanlance/print")
                            .setPattern("/nacos-provider/loadBanlance/**")
                            .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX)
                    );
                }});

        definitions.add(api);
        GatewayApiDefinitionManager.loadApiDefinitions(definitions);
    }

    /**
     * 設(shè)置限流的Api集合的具體限流
     */
    private void initGatewayRules() {
        /*
        GatewayFlowRule:網(wǎng)關(guān)限流規(guī)則扫夜,
        針對(duì) API Gateway 的場(chǎng)景定制的限流規(guī)則楞泼,可以針對(duì)不同 route 或自定義的 API 分組進(jìn)行限流,
        支持針對(duì)請(qǐng)求中的參數(shù)笤闯、Header堕阔、來(lái)源 IP 等進(jìn)行定制化的限流。
        */
        Set<GatewayFlowRule> rules = new HashSet<>();

        /*設(shè)置限流規(guī)則
        count: QPS即每秒鐘允許的調(diào)用次數(shù)
        intervalSec: 每隔多少時(shí)間統(tǒng)計(jì)一次匯總數(shù)據(jù)望侈,統(tǒng)計(jì)時(shí)間窗口,單位是秒勋桶,默認(rèn)是 1 秒脱衙。
        */
        //針對(duì)上面的  自定義ApiDefinition分組進(jìn)行限流
        rules.add(new GatewayFlowRule("myGateway")
                .setResourceMode(SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME)
                .setCount(5)
                .setIntervalSec(1)

        );
        GatewayRuleManager.loadRules(rules);
    }
6:測(cè)試 重復(fù)請(qǐng)求
方法一:
設(shè)置 允許調(diào)用次數(shù)少點(diǎn)(直接設(shè)置成0) 然后在postman不斷進(jìn)行點(diǎn)擊請(qǐng)求
方法二:
使用postman進(jìn)行并發(fā)測(cè)試

1:設(shè)置三個(gè)完全一樣的請(qǐng)求路徑 然后存到集合里面
2:在0秒的延遲(delay)內(nèi) 開啟 10個(gè)線程(Interation)  進(jìn)行對(duì)集合進(jìn)行請(qǐng)求 
3:點(diǎn)擊請(qǐng)求 查看結(jié)果  發(fā)現(xiàn)該路徑限制1秒內(nèi) 只能請(qǐng)求5次
7:自定義異常返回
public class MyBlockRequestHandler implements BlockRequestHandler {

    private static final String DEFAULT_BLOCK_MSG_PREFIX = "Blocked by Sentinel: ";

    @Override
    public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable ex) {
        // 返回http狀態(tài)碼為200
        return ServerResponse.status(200).contentType(MediaType.APPLICATION_JSON_UTF8)
                .body(fromObject(buildErrorResult(ex)));
    }
    
    private ErrorResult buildErrorResult(Throwable ex) {
        return new ErrorResult(200,
                DEFAULT_BLOCK_MSG_PREFIX + ex.getClass().getSimpleName());
    }
    
    private static class ErrorResult {
        private final int code;
        private final String message;

        ErrorResult(int code, String message) {
            this.code = code;
            this.message = message;
        }

        public int getCode() {
            return code;
        }

        public String getMessage() {
            return message;
        }
    }
}
8:限流日志
默認(rèn)sentinel的限流日志會(huì)存放在這里
有興趣的話可以自己查看  后續(xù)會(huì)講到sentinel的可視化日志界面
C:\Users\HSJ\logs\csp

項(xiàng)目連接

請(qǐng)配合項(xiàng)目代碼食用效果更佳:
項(xiàng)目地址:
https://github.com/hesuijin/spring-cloud-alibaba-project
Git下載地址:
https://github.com.cnpmjs.org/hesuijin/spring-cloud-alibaba-project.git

在gateway  模塊下
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市例驹,隨后出現(xiàn)的幾起案子捐韩,更是在濱河造成了極大的恐慌,老刑警劉巖鹃锈,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荤胁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡屎债,警方通過(guò)查閱死者的電腦和手機(jī)仅政,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盆驹,“玉大人圆丹,你說(shuō)我怎么就攤上這事∏” “怎么了辫封?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)廉丽。 經(jīng)常有香客問(wèn)我倦微,道長(zhǎng),這世上最難降的妖魔是什么正压? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任欣福,我火速辦了婚禮,結(jié)果婚禮上焦履,老公的妹妹穿的比我還像新娘劣欢。我一直安慰自己棕诵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布凿将。 她就那樣靜靜地躺著校套,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牧抵。 梳的紋絲不亂的頭發(fā)上笛匙,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音犀变,去河邊找鬼妹孙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛获枝,可吹牛的內(nèi)容都是我干的蠢正。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼省店,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嚣崭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起懦傍,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雹舀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后粗俱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體说榆,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年寸认,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了签财。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偏塞,死狀恐怖荠卷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烛愧,我是刑警寧澤油宜,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站怜姿,受9級(jí)特大地震影響慎冤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜沧卢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一蚁堤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧但狭,春花似錦披诗、人聲如沸撬即。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)剥槐。三九已至,卻和暖如春宪摧,著一層夾襖步出監(jiān)牢的瞬間粒竖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工几于, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蕊苗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓沿彭,卻偏偏與公主長(zhǎng)得像朽砰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喉刘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 框架SpringCloudSpringCloudAlibaba注冊(cè)中心Eurekanacos消息中間件無(wú)(第三方替...
    _River_閱讀 4,218評(píng)論 0 1
  • 學(xué)習(xí)筆記: 1.不管什么領(lǐng)域瞧柔,深耕十年,你不是專家也是專家饱搏,就是你要時(shí)刻在線非剃,時(shí)刻蹦跶置逻,能寫文章寫文章推沸,不能寫文章...
    正版瓷心魚閱讀 196評(píng)論 1 1
  • 1.核名:到工商局去領(lǐng)取一張“企業(yè)(字號(hào))名稱預(yù)先核準(zhǔn)申請(qǐng)表”,填寫你準(zhǔn)備取的公司名稱券坞,由工商局上網(wǎng)(工商局內(nèi)部網(wǎng)...
    周發(fā)財(cái)傳奇閱讀 89評(píng)論 0 0
  • 不知你有沒有過(guò)這樣的噩夢(mèng)鬓催,夢(mèng)中親人與你告別,你拼命奔跑追趕恨锚,但他們依舊在你視野里越來(lái)越小宇驾,小到一個(gè)點(diǎn),仿佛那就是永...
    厚丕蓄閱讀 148評(píng)論 0 1
  • 今天感恩節(jié)哎猴伶,感謝一直在我身邊的親朋好友课舍。感恩相遇!感恩不離不棄他挎。 中午開了第一次的黨會(huì)筝尾,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,571評(píng)論 0 11