国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Cloud Gateway 擴(kuò)展支持動(dòng)態(tài)限流

beanlam / 3711人閱讀

摘要:以流量為切入點(diǎn),從流量控制熔斷降級系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實(shí)踐

之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認(rèn)提供的限流過濾器來實(shí)現(xiàn)

原生RequestRateLimiter 的不足

配置方式

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表達(dá)式去的對應(yīng)的bean
        - StripPrefix=1

RequestRateLimiterGatewayFilterFactory

public GatewayFilter apply(Config config) {
    KeyResolver resolver = getOrDefault(config.keyResolver, defaultKeyResolver);
    RateLimiter limiter = getOrDefault(config.rateLimiter,
            defaultRateLimiter);
    boolean denyEmpty = getOrDefault(config.denyEmptyKey, this.denyEmptyKey);
    HttpStatusHolder emptyKeyStatus = HttpStatusHolder
            .parse(getOrDefault(config.emptyKeyStatus, this.emptyKeyStatusCode));

    return (exchange, chain) -> {
                return exchange.getResponse().setComplete();
            });
        });
    };
}

在實(shí)際生產(chǎn)過程中,必定不能滿足我們的需求

生產(chǎn)中路由信息是保存數(shù)據(jù)庫持久化或者配置中心,RequestRateLimiterGatewayFilterFactory 并不能隨著持久化數(shù)據(jù)的改變而動(dòng)態(tài)改變限流參數(shù),不能做到實(shí)時(shí)根據(jù)流量來改變流量閾值

Sentinel Spring Cloud Gateway 流控支持 Sentinel 是什么?

隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來越重要。Sentinel 以流量為切入點(diǎn),從流量控制、熔斷降級、系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性,分布式系統(tǒng)的流量防衛(wèi)兵。
從 1.6.0 版本開始,Sentinel 提供了 Spring Cloud Gateway 的適配模塊,可以提供兩種資源維度的限流:
route 維度:即在 Spring 配置文件中配置的路由條目,資源名為對應(yīng)的 routeId
自定義 API 維度:用戶可以利用 Sentinel 提供的 API 來自定義一些 API 分組

pom 依賴


    com.alibaba.cloud
    spring-cloud-alibaba-sentinel-gateway




    com.alibaba.csp
    sentinel-datasource-nacos
配置本地路由規(guī)則及其sentinel數(shù)據(jù)源
spring:
  application:
    name: sentinel-spring-cloud-gateway
  cloud:
    gateway:
      enabled: true
      discovery:
        locator:
          lower-case-service-id: true
      routes:
      - id: pigx_route
        uri: https://api.readhub.cn
        predicates:
        - Path=/topic/**
    sentinel:
      datasource.ds1.nacos:
        server-addr: 127.0.0.1:8848
        data-id: gw-flow
        group-id: DEFAULT_GROUP
        ruleType: gw-api-group
      filter:
        enabled: true
配置nacos數(shù)據(jù)源中的限流策略

常用限流策略 常量

以客戶端IP作為限流因子
public static final int PARAM_PARSE_STRATEGY_CLIENT_IP = 0;
以客戶端HOST作為限流因子
public static final int PARAM_PARSE_STRATEGY_HOST = 1;
以客戶端HEADER參數(shù)作為限流因子
public static final int PARAM_PARSE_STRATEGY_HEADER = 2;
以客戶端請求參數(shù)作為限流因子
public static final int PARAM_PARSE_STRATEGY_URL_PARAM = 3;
以客戶端請求Cookie作為限流因子
public static final int PARAM_PARSE_STRATEGY_COOKIE = 4;

核心源碼解析 SentinelGatewayFilter

sentinel通過擴(kuò)展Gateway的過濾器,通過選擇的不同GatewayParamParser 過處理請求限流因子和數(shù)據(jù)源中的配置進(jìn)行比較

源碼如下:

public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);

    Mono asyncResult = chain.filter(exchange);
    if (route != null) {
        String routeId = route.getId();
        Object[] params = paramParser.parseParameterFor(routeId, exchange,
            r -> r.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_ROUTE_ID);
        String origin = Optional.ofNullable(GatewayCallbackManager.getRequestOriginParser())
            .map(f -> f.apply(exchange))
            .orElse("");
        asyncResult = asyncResult.transform(
            new SentinelReactorTransformer<>(new EntryConfig(routeId, EntryType.IN,
                1, params, new ContextConfig(contextName(routeId), origin)))
        );
    }

    Set matchingApis = pickMatchingApiDefinitions(exchange);
    for (String apiName : matchingApis) {
        Object[] params = paramParser.parseParameterFor(apiName, exchange,
            r -> r.getResourceMode() == SentinelGatewayConstants.RESOURCE_MODE_CUSTOM_API_NAME);
        asyncResult = asyncResult.transform(
            new SentinelReactorTransformer<>(new EntryConfig(apiName, EntryType.IN, 1, params))
        );
    }

    return asyncResult;
}
效果演示

以上nacos 配置為 每秒只能通過5個(gè)請求,我們使用jmeter 4.0 來并發(fā)10個(gè)線程測試一下



通過上圖可以結(jié)果證明sentinel限流確實(shí)有效

動(dòng)態(tài)修改限流參數(shù)

sentinel-datasource-nacos 作為sentinel的數(shù)據(jù)源,可以從如上 nacos 管理臺實(shí)時(shí)刷新限流參數(shù)及其閾值

目前sentinel dashboard 1.6.2 暫未實(shí)現(xiàn)gateway 流控圖形化控制 , 1.7.0 會增加此功能

總結(jié)

以上源碼參考個(gè)人項(xiàng)目 基于Spring Cloud、OAuth2.0開發(fā)基于Vue前后分離的開發(fā)平臺

QQ: 2270033969 一起來聊聊你們是咋用 spring cloud 的吧。

歡迎關(guān)注我們獲得更多的好玩JavaEE 實(shí)踐

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/106177.html

相關(guān)文章

  • Spring Cloud Gateway 擴(kuò)展支持動(dòng)態(tài)限流

    摘要:以流量為切入點(diǎn),從流量控制熔斷降級系統(tǒng)負(fù)載保護(hù)等多個(gè)維度保護(hù)服務(wù)的穩(wěn)定性分布式系統(tǒng)的流量防衛(wèi)兵。歡迎關(guān)注我們獲得更多的好玩實(shí)踐 之前分享過 一篇 《Spring Cloud Gateway 原生的接口限流該怎么玩》, 核心是依賴Spring Cloud Gateway 默認(rèn)提供的限流過濾器來實(shí)現(xiàn) 原生RequestRateLimiter 的不足 配置方式 spring: clou...

    妤鋒シ 評論0 收藏0
  • 阿里Sentinel支持Spring Cloud Gateway

    摘要:應(yīng)對突發(fā)請求時(shí)額外允許的請求數(shù)目。勻速排隊(duì)模式下的最長排隊(duì)時(shí)間,單位是毫秒,僅在勻速排隊(duì)模式下生效。和為后續(xù)參數(shù)匹配特性預(yù)留,目前未實(shí)現(xiàn)。 1. 前言 4月25號,Sentinel 1.6.0 正式發(fā)布,帶來 Spring Cloud Gateway 支持、控制臺登錄功能、改進(jìn)的熱點(diǎn)限流和注解 fallback 等多項(xiàng)新特性,該出手時(shí)就出手,緊跟時(shí)代潮流,昨天剛發(fā)布,今天我就要給大家分...

    chengtao1633 評論0 收藏0
  • spring cloud gateway限流

    摘要:常見的限流方式,比如適用線程池隔離,超過線程池的負(fù)載,走熔斷的邏輯。在令牌桶算法中,存在一個(gè)桶,用來存放固定數(shù)量的令牌。,令牌桶每秒填充平均速率。 轉(zhuǎn)載請標(biāo)明出處: https://www.fangzhipeng.com本文出自方志朋的博客 在高并發(fā)的系統(tǒng)中,往往需要在系統(tǒng)中做限流,一方面是為了防止大量的請求使服務(wù)器過載,導(dǎo)致服務(wù)不可用,另一方面是為了防止網(wǎng)絡(luò)攻擊。 常見的限流方式,...

    joy968 評論0 收藏0
  • Spring Cloud Gateway限流實(shí)戰(zhàn)

    摘要:歡迎訪問我的歡迎訪問我的內(nèi)容所有原創(chuàng)文章分類匯總及配套源碼,涉及等本篇概覽本篇概覽本文是實(shí)戰(zhàn)系列的第八篇,經(jīng)過前面的學(xué)習(xí),咱們對過濾器已了解得差不多,今天來補(bǔ)全過濾器的最后一個(gè)版塊限流默認(rèn)的限流器是基于實(shí)現(xiàn)的,限流算法是大家熟悉的令牌桶關(guān)于歡迎訪問我的GitHubhttps://github.com/zq2599/blog_demos內(nèi)容:所有原創(chuàng)文章分類匯總及配套源碼,涉及Java、Doc...

    stonezhu 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<