Spring Cloud Gateway 原生支持接口限流該怎么玩,cloudgateway

    關于pig:

    基于Spring Cloud、oAuth2.0開發基于Vue前后分離的開發平臺,支持賬號、短信、SSO等多種登錄,提供配套視頻開發教程。愛掏網 - it200.com

    關于 Spring Cloud Gateway

    SpringCloudGateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技術開發的網關,Spring云網關旨在提供一種簡單而有效的路由API的方法。愛掏網 - it200.comSpring Cloud Gateway作為Spring Cloud生態系中的網關,目標是替代Netflix ZUUL,其不僅提供統一的路由方式,并且基于Filter鏈的方式提供了網關基本的功能,例如:安全,監控/埋點,和限流等。愛掏網 - it200.com

    zuul如何實現多維度限流請參考我的博客

    [Zuul:構建高可用網關之多維度限流]

    開始Gateway 限流

    POM 依賴

    
    org.springframework.cloudspring-cloud-starter-gatewayorg.springframework.bootspring-boot-starter-data-redis-reactive

    配置按照請求IP 的限流

    spring:
      cloud:
        gateway:
          routes:
          - id: requestratelimiter_route
            uri: lb://pigx-upms
            order: 10000
            predicates:
            - Path=/admin/**
            filters:
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 1  # 令牌桶的容積
                redis-rate-limiter.burstCapacity: 3  # 流速 每秒
                key-resolver: "#{@remoteAddrKeyResolver}" #SPEL表達式去的對應的bean
            - StripPrefix=1

    配置bean,多維度限流量的入口

    /**
    * 自定義限流標志的key,多個維度可以從這里入手
    * exchange對象中獲取服務ID、請求信息,用戶信息等
    */
    @Bean
    KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }

    OK 完成。愛掏網 - it200.com

    壓力測試

    并發5個線程。愛掏網 - it200.com
    image

    Redis 數據變化

    我們使用redis的monitor 命令,實時查看redis 的操作情況。愛掏網 - it200.com
    會發現在redis中會操作兩個key

    • request_rate_limiter.{xxx}.timestamp
    • request_rate_limiter.{xxx}.tokens
      image

    實現原理

    image

    Spring Cloud Gateway 默認實現 Redis限流,如果擴展只需要實現ratelimter接口即可。愛掏網 - it200.com

    RedisRateLimter 的核心代碼,判斷是否取到令牌的實現,通過調用 redis的LUA 腳本。愛掏網 - it200.com

    public Mono isAllowed(String routeId, String id) {
        Config routeConfig = getConfig().getOrDefault(routeId, defaultConfig);
        int replenishRate = routeConfig.getReplenishRate();
        int burstCapacity = routeConfig.getBurstCapacity();
    
        try {
            List keys = getKeys(id);
            returns unixtime in seconds.
            List scriptArgs = Arrays.asList(replenishRate + "", burstCapacity + "",
                    Instant.now().getEpochSecond() + "", "1");
            // 這里是核心,執行redis 的LUA 腳本。愛掏網 - it200.com
            Flux> flux =
            this.redisTemplate.execute(this.script, keys, scriptArgs);
            return flux.onErrorResume(throwable -> Flux.just(Arrays.asList(1L, -1L)))
                    .reduce(new ArrayList(), (longs, l) -> {
                        longs.addAll(l);
                        return longs;
                    }) .map(results -> {
                        boolean allowed = results.get(0) == 1L;
                        Long tokensLeft = results.get(1);
    
                        Response response = new Response(allowed, getHeaders(routeConfig, tokensLeft));
    
                        if (log.isDebugEnabled()) {
                            log.debug("response: " + response);
                        }
                        return response;
                    });
        }
        catch (Exception e) {
            log.error("Error determining if user allowed from redis", e);
        }
        return Mono.just(new Response(true, getHeaders(routeConfig, -1L)));
    }

    LUA 腳本

    image

    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 日韩福利视频一区| 日本一区二区三区不卡在线视频| 日韩精品一区二区三区老鸭窝| 午夜在线视频一区二区三区| 久久精品国产一区| 夜夜精品无码一区二区三区| 精品无码人妻一区二区三区品 | 亚洲乱码一区二区三区国产精品| 亚洲一区二区三区无码影院| 美日韩一区二区三区| 国产经典一区二区三区蜜芽 | 国产在线观看精品一区二区三区91| 亚洲熟妇av一区二区三区漫画| 一区二区三区日本电影| 视频一区二区在线观看| 国产主播福利精品一区二区| 天美传媒一区二区三区| 久久一区二区三区精华液使用方法 | 亚洲日韩国产精品第一页一区| 日本一区二区在线免费观看| 成人h动漫精品一区二区无码| 国产精品成人免费一区二区| 日韩一区二区三区射精| 久久一区二区三区精华液使用方法| 无码福利一区二区三区| 亚洲AV无码一区二区三区电影| 亚洲熟女综合一区二区三区| 无码中文字幕一区二区三区| 日本精品无码一区二区三区久久久| 精品动漫一区二区无遮挡| 亚洲乱码一区二区三区国产精品| 亚洲国产一区在线| 国产乱码一区二区三区| 日韩欧美一区二区三区免费观看 | 日本中文一区二区三区亚洲| 一区二区高清在线观看| 国产丝袜视频一区二区三区| 国产精品视频第一区二区三区| 2022年亚洲午夜一区二区福利| 一区二区传媒有限公司| 精品一区二区三区在线观看l |