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 條評論)
暫無評論

返回頂部

主站蜘蛛池模板: 毛片网站在线观看| 18禁亚洲深夜福利人口| 精品福利一区二区三区免费视频| 日本特黄高清免费大片爽| 国产成人黄色小说| 久久青草免费91观看| 国产一区二区三区乱码网站| 精品国产无限资源免费观看| 欧美三级香港三级日本三级| 国产精品任我爽爆在线播放| 四虎www成人影院| 中文成人无字幕乱码精品区| 色之综合天天综合色天天棕色| 欧美精品一区二区三区在线| 国产综合色在线视频区| 亚洲国产欧美日韩| 欧美亚洲另类视频| 日韩在线观看中文字幕| 国产亚洲精品aaaaaaa片| 中文字幕韩国电影| 精品国产高清自在线一区二区三区| 巨大欧美黑人xxxxbbbb| 亚洲首页在线观看| 7777精品久久久大香线蕉| 欧美11一12周岁a在线观看| 国产小视频福利| 中文字幕巨大乳在线看| 米兰厉云封免费阅读完结| 日本一卡2卡3卡4卡无卡免费| 国产AV一区二区精品凹凸 | 精品乱子伦一区二区三区| 女人把腿给男人桶视频app| 亚洲精品乱码久久久久久蜜桃图片| 91精品国产91久久久久久| 果冻传媒电影免费看| 国产免费一区二区三区在线观看 | 再灬再灬再灬深一点舒服视频| 久久亚洲精品中文字幕| 羞羞色院91精品网站| 女人与zozo| 免费体验120秒视频|