中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring Cloud中怎么利用Gateway實現擴展支持動態限流

發布時間:2021-07-30 14:09:39 來源:億速云 閱讀:202 作者:Leah 欄目:大數據

本篇文章為大家展示了Spring Cloud中怎么利用Gateway實現擴展支持動態限流,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

原生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表達式去的對應的bean
        - StripPrefix=1
  • RequestRateLimiterGatewayFilterFactory

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

	return (exchange, chain) -&gt; {
				return exchange.getResponse().setComplete();
			});
		});
	};
}
  • 在實際生產過程中,必定不能滿足我們的需求

    生產中路由信息是保存數據庫持久化或者配置中心,RequestRateLimiterGatewayFilterFactory 并不能隨著持久化數據的改變而動態改變限流參數,不能做到實時根據流量來改變流量閾值

Sentinel Spring Cloud Gateway 流控支持

Sentinel 是什么?

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

pom 依賴

<!--Spring Cloud Alibaba 封裝的 sentinel 模塊-->
<dependency>
    <groupid>com.alibaba.cloud</groupid>
    <artifactid>spring-cloud-alibaba-sentinel-gateway</artifactid>
</dependency>

<!--使用nacos 保存限流規則-->
<dependency>
    <groupid>com.alibaba.csp</groupid>
    <artifactid>sentinel-datasource-nacos</artifactid>
</dependency>

配置本地路由規則及其sentinel數據源

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數據源中的限流策略

Spring Cloud中怎么利用Gateway實現擴展支持動態限流

  • 常用限流策略 常量

以客戶端IP作為限流因子
public static final int PARAM_PARSE_STRATEGY_CLIENT_IP = 0;
以客戶端HOST作為限流因子
public static final int PARAM_PARSE_STRATEGY_HOST = 1;
以客戶端HEADER參數作為限流因子
public static final int PARAM_PARSE_STRATEGY_HEADER = 2;
以客戶端請求參數作為限流因子
public static final int PARAM_PARSE_STRATEGY_URL_PARAM = 3;
以客戶端請求Cookie作為限流因子
public static final int PARAM_PARSE_STRATEGY_COOKIE = 4;
  • 核心源碼解析 SentinelGatewayFilter

sentinel通過擴展Gateway的過濾器,通過選擇的不同GatewayParamParser 過處理請求限流因子和數據源中的配置進行比較 源碼如下:

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

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

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

    return asyncResult;
}

效果演示

  • 以上nacos 配置為 每秒只能通過5個請求,我們使用jmeter 4.0 來并發10個線程測試一下 Spring Cloud中怎么利用Gateway實現擴展支持動態限流 Spring Cloud中怎么利用Gateway實現擴展支持動態限流 Spring Cloud中怎么利用Gateway實現擴展支持動態限流

  • 通過上圖可以結果證明sentinel限流確實有效

動態修改限流參數

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

  • 目前sentinel dashboard 1.6.2 暫未實現gateway 流控圖形化控制 , 1.7.0 會增加此功能

上述內容就是Spring Cloud中怎么利用Gateway實現擴展支持動態限流,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新田县| 福清市| 蓝田县| 广昌县| 桐城市| 阿克苏市| 万荣县| 朔州市| 巴马| 将乐县| 博罗县| 芷江| 昌乐县| 永嘉县| 凤冈县| 安新县| 麻城市| 万山特区| 绥棱县| 始兴县| 开江县| 辽宁省| 宁都县| 安化县| 茌平县| 凤凰县| 昌邑市| 滁州市| 建平县| 观塘区| 麦盖提县| 麻江县| 武义县| 巨野县| 屏南县| 扶余县| 中西区| 宜黄县| 静海县| 凤阳县| 贞丰县|