最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Cloud?Gateway服務(wù)網(wǎng)關(guān)限流問(wèn)題及解決

 更新時(shí)間:2025年04月02日 09:34:07   作者:阿Q說(shuō)代碼  
這篇文章主要介紹了Spring?Cloud?Gateway服務(wù)網(wǎng)關(guān)限流問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

網(wǎng)關(guān)是所有請(qǐng)求的公共入口,所以可以在網(wǎng)關(guān)進(jìn)行限流,而且限流的方式也很多,我們本次采用前面學(xué)過(guò)的 Sentinel 組件來(lái)實(shí)現(xiàn)網(wǎng)關(guān)的限流。

Sentinel 支持對(duì) SpringCloud Gateway、Zuul等主流網(wǎng)關(guān)進(jìn)行限流。

從1.6.0版本開(kāi)始,Sentinel提供了SpringCloud Gateway的適配模塊,可以提供兩種資源維度的限流:

  • route維度:即在Spring配置文件中配置的路由條目,資源名為對(duì)應(yīng)的routeld;
  • 自定義API維度:用戶可以利用Sentinel提供的API來(lái)自定義一些API分組;

route限流

導(dǎo)入依賴

<dependency>
	<groupId>com.alibaba.csp</groupId>
	<artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
</dependency>

編寫配置類

基于Sentinel的Gateway限流是通過(guò)其提供的Filter來(lái)完成的,使用時(shí)只需注入對(duì)應(yīng)的SentinelGatewayFilter實(shí)例以及SentinelGatewayBlockExceptionHandler實(shí)例即可。

@Configuration
public class GatewayConfiguration {
    private final List<ViewResolver> viewResolvers;
    private final ServerCodecConfigurer serverCodecConfigurer;

    public GatewayConfiguration(ObjectProvider<List<ViewResolver>> viewResolversProvider, ServerCodecConfigurer serverCodecConfigurer) {
        this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
        this.serverCodecConfigurer = serverCodecConfigurer;
    }

    //初始化一個(gè)限流的過(guò)濾器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public GlobalFilter sentinelGatewayFilter() {
        return new SentinelGatewayFilter();
    }

    //配置初始化的限流參數(shù)
    @PostConstruct
    public void initGatewayRules() {
        Set<GatewayFlowRule> rules = new HashSet<>();
        rules.add(new GatewayFlowRule("shop-product")//資源名稱,對(duì)應(yīng)路由id
                        .setCount(1)//限流閥值
                        .setIntervalSec(1)//統(tǒng)計(jì)時(shí)間窗口,單位是秒,默認(rèn)是1秒
        );
        GatewayRuleManager.loadRules(rules);
    }


    //配置限流異常處理器
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }

    //自定義限流異常頁(yè)面
    @PostConstruct
    public void initBlockHandlers() {
        BlockRequestHandler blockRequestHandler = new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map map= new HashMap<>();
                map.put("code", 0);
                map.put("message", "接口被限流了");
                return ServerResponse
                        .status(HttpStatus.OK)
                        .contentType(MediaType.APPLICATION_JSON_UTF8)
                        .body(BodyInserters.fromObject(map));
            }
        } ;
        GatewayCallbackManager.setBlockHandler(blockRequestHandler);
    }
}

其中,GatewayFlowRule 網(wǎng)關(guān)限流規(guī)則中提供了如下屬性:

  • 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ī)則。其中的字段如下:
  • arseStrategy:從請(qǐng)求中提取參數(shù)的策略,目前支持提取來(lái)源IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意Header(PARAM_PARSE_STRATEGY_HEADER)和任意URL 參數(shù)(PARAM_PARSE_STRATEGY_URL_PARAM)四種模式。
  • fieldName:若提取策略選擇Header模式或者URL參數(shù)模式,則需要指定對(duì)應(yīng)的Header名稱或URL參數(shù)名稱。
  • patternmatchStrategy:為后續(xù)參數(shù)匹配特性預(yù)留,目前末實(shí)現(xiàn)。

測(cè)試

在一秒鐘內(nèi)多次訪問(wèn)http://localhost:7000/product/product/1?token=1232就可以看到限流啟作用了。

自定義API分組

自定義API分組是一種更細(xì)粒度的限流規(guī)則定義

//配置初始化的限流參數(shù)
@PostConstruct
public void initGatewayRules() {
    Set<GatewayFlowRule> rules = new HashSet<>();
    rules.add(new GatewayFlowRule("shop_product_api").setCount(1).setIntervalSec(1));
    rules.add(new GatewayFlowRule("shop_order_api").setCount(1).setIntervalSec(1));
    GatewayRuleManager.loadRules(rules);
}

//自定義API分組
@PostConstruct
private void initCustomizedApis(){
    Set<ApiDefinition> definitions = new HashSet<>();
    //定義小組1
    ApiDefinition api1 = new ApiDefinition("shop_product_api")
            .setPredicateItems(new HashSet<ApiPredicateItem>(){{
                //以/product/product/api1開(kāi)頭的請(qǐng)求
                add(new ApiPathPredicateItem().setPattern("/product/product/**")
                        .setMatchStrategy(SentinelGatewayConstants.URL_MATCH_STRATEGY_PREFIX));
            }});
    //定義小組2
    ApiDefinition api2 = new ApiDefinition("shop_order_api")
            .setPredicateItems(new HashSet<ApiPredicateItem>(){{
                //完全匹配/order/order2/message
                add(new ApiPathPredicateItem().setPattern("/order/order2/message"));
            }});
    definitions.add(api1);
    definitions.add(api2);
    GatewayApiDefinitionManager.loadApiDefinitions(definitions);
}

在一秒鐘內(nèi)多次訪問(wèn)http://localhost:7000/product/product/1?token=1232也可以看到限流啟作用了。

總結(jié)

到這兒,Gateway 服務(wù)網(wǎng)關(guān)限流的內(nèi)容就已經(jīng)介紹完了。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在IDEA中創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)步驟

    在IDEA中創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)步驟

    這篇文章主要給大家介紹了在IDEA中創(chuàng)建SpringBoot項(xiàng)目的詳細(xì)步驟,文中有詳細(xì)的圖文介紹和代碼示例,對(duì)大家的學(xué)習(xí)和工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • 教你Spring如何使用三級(jí)緩存解決循環(huán)依賴

    教你Spring如何使用三級(jí)緩存解決循環(huán)依賴

    這篇文章主要介紹了Spring使用三級(jí)緩存解決循環(huán)依賴的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Springboot中如何使用Redisson實(shí)現(xiàn)分布式鎖淺析

    Springboot中如何使用Redisson實(shí)現(xiàn)分布式鎖淺析

    redisson是redis的java客戶端程序,國(guó)內(nèi)外很多公司都有在用,下面這篇文章主要給大家介紹了關(guān)于Springboot中如何使用Redisson實(shí)現(xiàn)分布式鎖的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • JAVA抽象類和抽象方法(abstract)實(shí)例分析

    JAVA抽象類和抽象方法(abstract)實(shí)例分析

    這篇文章主要介紹了JAVA抽象類和抽象方法(abstract),結(jié)合實(shí)例形式分析了java抽象類及抽象方法相關(guān)定義、使用技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 一文搞懂Java中的注解和反射

    一文搞懂Java中的注解和反射

    這篇文章主要給大家介紹了關(guān)于Java中注解和反射的原理及使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • JVM的垃圾回收算法一起來(lái)看看

    JVM的垃圾回收算法一起來(lái)看看

    這篇文章主要為大家詳細(xì)介紹了JVM的垃圾回收算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • 詳解SpringBoot依賴注入和使用配置文件

    詳解SpringBoot依賴注入和使用配置文件

    這篇文章主要介紹了SpringBoot依賴注入和使用配置文件的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源

    在某些情況下,如果我們需要配置多個(gè)數(shù)據(jù)源,本文主要介紹了SpringBoot采用Dynamic-Datasource方式實(shí)現(xiàn)多JDBC數(shù)據(jù)源,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • java實(shí)現(xiàn)隨機(jī)生成UUID

    java實(shí)現(xiàn)隨機(jī)生成UUID

    這篇文章主要介紹了java實(shí)現(xiàn)隨機(jī)生成UUID的函數(shù)代碼,有需要的小伙伴可以參考下。
    2015-07-07
  • mybatis調(diào)用存儲(chǔ)過(guò)程,帶in、out參數(shù)問(wèn)題

    mybatis調(diào)用存儲(chǔ)過(guò)程,帶in、out參數(shù)問(wèn)題

    這篇文章主要介紹了mybatis調(diào)用存儲(chǔ)過(guò)程,帶in、out參數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

昌邑市| 循化| 西华县| 溆浦县| 延长县| 合肥市| 新源县| 慈溪市| 保定市| 河北省| 昌黎县| 英德市| 屏边| 巧家县| 钟山县| 宁乡县| 肥东县| 武山县| 萝北县| 仁化县| 泸西县| 山东省| 卢湾区| 怀安县| 治县。| 美姑县| 公安县| 鲁甸县| 嘉义市| 本溪市| 曲松县| 玛沁县| 北辰区| 晋州市| 遵义县| 迁西县| 清徐县| 兴和县| 饶河县| 无极县| 叶城县|