Spring Coud ZuulマイクロサービスゲートウェイのAPI制限ストリーム

2872 ワード

Spring Coud ZuulマイクロサービスゲートウェイのAPI制限ストリーム
 
もっと多くの乾物
  • 分布式実戦(乾燥品)
  • spring cloud実戦(乾燥品)
  • mybatis実戦(乾燥品)
  • spring boot実戦(乾燥品)
  • React入門実戦(乾燥品)
  • 中小型インターネット企業アーキテクチャを構築する
  • .
  • python学習継続更新
  • ElasticSearchノート
  • kafka storm実戦(乾燥品)
  • API制限ストリーム
    マイクロサービス開発においては、APIに対して制限ストリーム保護を行う必要があり、ネットワーク攻撃を防止する.例えば、ショートメッセージ認証コードAPIを行うと、クライアントの要求速度を制限することで、ある程度のショートメール攻撃を防ぎ、損失を低減することができる.
    マイクロサービスゲートウェイは、各要求の入口を通る必要があり、いくつかのAPI制限ストリーム、認証などの動作に非常に適しています.ここにはzulマイクロサービスゲートウェイに基づくAPI制限フローライブラリがあります. https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
    使い方
    例えば、私達はuserinfo-consumerというサービスに対して制限を行います.各要求源に対して、最大3回までお願いします.まずプロジェクトにzulとratelimitの依存を追加して、次のような構成を追加すればいいです.
     
  • zuul.routes.userinfo.path=/getuser/**
  • zuul.routes.userinfo.serviceId=userinfo-consumer
  • zuul.ratelimit.enabled=true
  • zuul.ratelimit.policies.userinfo.limit=3
  • zuul.ratelimit.policies.userinfo.refresh-interval=60
  • zuul.ratelimit.policies.userinfo.type=origin
  • クライアントをテストします.60 s以内の要求が3回を超えたら、サーバーから異常が出ます.1分後に正常に
  • を要求できます.
  • のあるIPのクライアントは、制限されたストリームによって他のクライアントに影響を与えない、すなわちAPIゲートウェイは、各クライアント制限ストリームに対して相互に独立した
  • である.
    原理分析
    API制限ストリームはzulフィルタに基づいて行われています.redisを使わないと、制限ストリームデータはメモリに記録されています.一般的に開発環境で直接メモリに記録できます.生産環境ではRedisを使用します.
    限流ブロックタイミング
    フロー制限フィルタは、転送を要求する前に呼び出します.
     
  • @Override
  • public String filterType() {
  • return "pre";
  • }
  • 限流タイプ
    流れ制限タイプは主にurl、orign、userの3種類があります.
     
  • if (types.contains(URL)) {
  • joiner.add(route.getPath());
  • }
  • if (types.contains(ORIGIN)) {
  • joiner.add(getRemoteAddr(request));
  • }
  • if (types.contains(USER)) {
  • joiner.add(request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : ANONYMOUS);
  • }
  • urlタイプの制限ストリームは、要求経路によって
  • を区別することである.
  • オリジンは、クライアントIPアドレスによって
  • を区別する.
  • userはログインユーザ名によって区別され、匿名ユーザ
  • も含む.
  • は、複数のストリーム制限タイプを組み合わせて
  • を使用してもよい.
  • 限流タイプが配置されていない場合、以上の区分は行わない.
    ブロックフロー要求
    フィルタのrunメソッドで要求残数を判断する
     
  • if (rate.getRemaining() < 0) {
  • ctx.setResponseStatusCode(TOO_MANY_REQUESTS.value());
  • ctx.put("rateLimitExceeded", "true");
  • throw new ZuulRuntimeException(new ZuulException(TOO_MANY_REQUESTS.toString(),
  • TOO_MANY_REQUESTS.value(), null));
  • }