春クラウドゲートウェイは、制限の動的拡張をサポートしています

記事を共有する前に、「春のクラウドゲートウェイのネイティブインターフェースは、再生する方法を制限する」、コアは、春クラウドゲートウェイに依存して達成するために、デフォルトの電流制限フィルタを提供

ネイティブ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) -> {
				return exchange.getResponse().setComplete();
			});
		});
	};
}
复制代码
  • 実際の製造工程では、我々は我々のニーズを満たしていません。

    ルーティング情報は、本番データベースの永続性または配布センタに格納され、RequestRateLimiterGatewayFilterFactory交通流に応じて動的パラメータを制限データの変更などの永続的な変化は、それが閾値を変更するためにリアルタイムで行うことができないではありません

センチネル春クラウドゲートウェイのフロー制御をサポート

何センチネルこと?

人気のマイクロサービス、サービス、およびサービス間の安定性でますます重要になってきています。センチネルは、出発点として、フロー制御、ヒューズダウングレード、サービスの安定性を保護するためのシステム負荷保護の寸法、分散システムフロー防御兵を流します。
ルートの寸法:Spring構成ファイルで構成されたルーティングエントリ、カスタムルートIDと呼ばれ、対応するリソースのバージョン1.6.0を開始してから、センチネルは春クラウドゲートウェイアダプタモジュールを提供しています、2つのリソースは、電流制限寸法を提供することができますAPIの寸法:ユーザーはいくつかのパケットを定義するためにAPIから提供されたセンチネルAPIを使用することができます

ポンポン依存

<!--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>
复制代码

そして、ローカルルーティングルールデータソースセンチネルを設定

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
复制代码

制限ポリシーにナコスデータソースの設定

  • ポリシーを制限する共通の定数
以客户端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を解析コアソースコード

異なる選択することにより、フィルタによって拡張ゲートウェイセンチネル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 -> 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<String> 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;
}

复制代码

デモンストレーション効果

  • わずか5要求ごとにより構成され、よりナコスでは、我々は使用jmeter 4.0同時実行スレッド10をテストするために、

  • なお、図は、信頼できる制限センチネルによって証明することができます

制限パラメータの動的変更

  • sentinel-datasource-nacos センチネルデータソースとして、リアルタイム管理テーブルナコスから閾値として制限パラメータをリフレッシュすることができます
  • 現在、センチネルダッシュボード1.6.2はまだグラフィカルな制御フロー制御ゲートウェイを達成するために、1.7.0この機能を増加します

概要

ようこそ私たちはより多くの楽しみのJavaEE練習を取得フォロー

おすすめ

転載: juejin.im/post/5d3f95a8f265da039e12959d