春クラウドゲートウェイの制限の原則

Gatewayマイクロサービスアーキテクチャのシステムでは、システムの可用性、セキュリティ、およびその他の問題を改善し、内部サービスシステムの安全バリアを提供します。使用すると、Gatewayすぐにセキュリティ制御、フロー制御、監査ログ、バージョン管理やその他の問題を心配することなく、アプリケーションを開発する開発者を可能にします。

なぜ制限

簡単に言えば、トラフィック制御を制限することを任意にに行きたいのではなく、その内部に合理的、円滑かつ効果的なサービス提供することですが、システムの動作に影響を与えます。たとえば、次のような状況のいくつかは、システムの流量は、いくつかの予期せぬ問題につながる短時間で増加されていることを確認します:

  • ユーザーはより速く成長しています
  • サービスの可用性を確保するための時間のピーク営業期間
  • 対応ネットワークの爬虫類
  • スキャルピングは、システムに悪質な、不正アクセスを防止します
  • ...

イベントは、サービスが利用できないため、システム圧力が最終的に引き起こす可能性がつながる電流制限が存在しない場合に、トラフィックサービスが突然非常に短時間であまりにも速く成長する原因となる場合は、上記のこれらの状況は予測することは困難です自動サーバー再起動(古代に~~首を切ることでした)。あなたは現在の制限が流れを効果的に制御されるずっと良いだろう持っている場合は逆に、あなたが内部サービスを保護する目的を達成するために、サービスの圧力を減らすことができるようにダイレクトアクセスの閾値は、ゲートウェイレベルで拒否される超えています。

制限ポリシー

交通規制は、ここでは、任意の制約、制限悪い逆ではありませんいくつかの一般的な制限の戦略です。

  1. リモートアドレス電流制限を押してください
  2. ユーザーを制限することにより、
  3. APIを制限することにより、
  4. プレスremote地址 + api
  5. プレスremote地址 + user
  6. ...

そこ最も適切で最善である選択する多くの戦略があるので、彼らは取ったremote ipそれを制限するために、例えば、何百人もの人々は、あなたが使用している人々の数百秒の制限あたりつのパブリックIP、LANシステム10個の要求が共有されていますアプリケーションは、多くの場合、拒否され、そしてあなたがこのケースを押すと、その経験は、悪いされている場合user、毎秒10件のリクエストを送信することができ、各ユーザーを制限するために与えるapi私たちが持っているかもしれないより総限度追加remote良い戦略がたくさん。したがって、時間の流れだけでなく、戦略の検討事項を制限し、最も適切な事業戦略のシーンを選択します。

春クラウドゲートウェイの制限の原則

使用しSpring Cloud Gatewayている場合、トラフィック管理の後、?ここでは、次の使用方法を議論する必要がSpring Cloud Gateway最初に理解することは、簡単なトラフィック管理をSpring Cloud Gateway作品:

上記のチャートを見つけるのは難しいことではありませんした後、トラフィックがに変わります。

  1. Gateway Handler Mapping
  2. Gateway Web Handler
  3. Filter
  4. そして最後に内部サービス(プロキシさサービス)へ

到着Proxied Serviceの対処方法後の要求Gateway事項は、要求の処理が完了するために戻ってGateway処理した後に行います。見つけるための要求は、我々は言葉で表せないほどまでに何かを要求する前と後の処理を要求することができます!

RequestRateLimiterGatewayFilterFactoryフィルタ

Spring Cloud Gateway多くは、内蔵のFilter、のような:AddRequestHeaderAddRequestParameterなど、直接使用するために使用することができ、唯一の簡単な設定パラメータを必要とします。この記事では、に焦点を当ててRequestRateLimiter電流制限を完了するために、内蔵のフィルター。最初のテストインタフェースを記述します。

package com.example.gateway;

@RestController
@RequestMapping("/traffic")
public class TrafficController {


    @GetMapping
    public ResponseEntity<String> testTrafficLimit(){
        return ResponseEntity.ok("Success");
    }
}
复制代码

そして、ルーティングを設定します。

 spring:
  cloud:
    gateway:
      routes:
      - id: traffic_litmit
        uri: http://localhost:8080
        predicates:
         - Path=/traffic_route
        filters:
         - RewritePath=/traffic_route, /traffic
         - name: RequestRateLimiter
           args:
            rate-limiter: "#{@defaultRateLimiter}"
            key-resolver: "#{@hostAddKeyResolver}"
复制代码

名前を追加上記の構成RequestRateLimiterフィルタはRequestRateLimiter、フィルタの植物の名前として理解することができるSpring Cloud Gatewayを通じてGatewayFilter Factoriesフィルタを実現するために、RequestRateLimiter対応するファクトリクラスであるRequestRateLimiterGatewayFilterFactoryことをRequestRateLimiterGatewayFilterFactoryそれがどのように動作しますか?

上記のチャートの組み合わせは、単にほとんどのステップ2に置きます:

  1. キーを取得
  2. アクセスを許可するかどうかを決定

呼び出すことによってキーKeyResolverのインスタンスは、通話によるアクセスを許可するかどうかを判断する取得RateLimiterを決定します。労働の部門は非常に明確であるので、使用Spring Cloud Gateway電流は唯一の制限友達になることができ、フィルタの設定と一緒にこの2つのインタフェースを実装する必要があります。

春クラウドゲートウェイの使用を制限します

私はそれが簡単に持っていた言及したSpring Cloud Gateway組み合わせ、電流制限のいくつかの知識をGuavaシンプルにするためにRateLimiter、コードにあまり話をしなかった、流れの下限の使用を実証します:

public class DefaultRateLimiter extends AbstractRateLimiter<DefaultRateLimiter.Config> {

    Logger logger = LoggerFactory.getLogger(DefaultRateLimiter.class.getName());

    /**
     * 默认一秒一个请求,多了不收了~~
     */
    private final RateLimiter limiter = RateLimiter.create(1);


    public DefaultRateLimiter() {
        super(Config.class, "default-rate-limit", null);
    }

    @Override
    public Mono<Response> isAllowed(String routeId, String id) {
        Config config = getConfig().get(routeId);
        limiter.setRate(Objects.isNull(config.getPermitsPerSecond()) ? 1 : config.getPermitsPerSecond());

        logger.info("Rate: {}", limiter.getRate());
        boolean isAllow = limiter.tryAcquire();

        logger.info("isAllow: {} , time:  {}",isAllow,  System.currentTimeMillis());
        return Mono.just(new Response(isAllow, new HashMap<>()));
    }

    @Validated
    public static class Config {

        @DecimalMin("0.1")
        private Double permitsPerSecond;


        public Double getPermitsPerSecond() {
            return permitsPerSecond;
        }

        public Config setPermitsPerSecond(Double permitsPerSecond) {
            this.permitsPerSecond = permitsPerSecond;
            return this;
        }
    }
}
复制代码

そして、電流制限機能を完了するために、フィルタの設定を変更します。

filters:
 - RewritePath=/traffic_route, /traffic
 - name: RequestRateLimiter
   args:
    rate-limiter: "#{@defaultRateLimiter}"
    key-resolver: "#{@hostAddKeyResolver}"
    default-rate-limit.permitsPerSecond: 0.5

复制代码

これは、カスタム完了しRateLimiter、特別な要件場合は、あなたが直接使用することができRedisRateLimiter、電流制限を実装するために、これは、内蔵された電流リミッタを唯一の簡単な構成を必要とする2つのパラメータを使用することができます。

 filters:
 - StripPrefix=1
 - name: RequestRateLimiter
   args:
    redis-rate-limiter.replenishRate: 1
    redis-rate-limiter.burstCapacity: 2
复制代码

パラメータ:

  • Redisのレート - limiter.replenishRate:毎秒どのように多くのリクエストにユーザーを許可します
  • Redisのレート - limiter.burstCapacity:トークンバケット容量は、要求の最大数は、1秒で完了しました

概要

この記事では、いくつかの簡単な知識とゲートウェイについて説明しSpring Cloud Gateway、電流制限のために、そして私たちが手助けをしたい、我々は最後の数世間の注目を歓迎:Java派ジャワ、Androidの知識について話すことができます。

おすすめ

転載: juejin.im/post/5da271766fb9a04e20417b4d