web-dev-qa-db-ja.com

Spring Bootで各ユーザーのレート制限を設定するにはどうすればよいですか?

多くの着信リクエスト呼び出しを処理するSpring Boot Rest APIを開発しています。私のコントローラーは以下のようなものです:

@RestController

public class ApiController {
    List<ApiObject>  apiDataList;   

    @RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
    public ResponseEntity<List<ApiObject>> getData(){                                       
        List<ApiObject> apiDataList=getApiData();
        return new ResponseEntity<List<ApiObject>>(apiDataList,HttpStatus.OK);
    }
    @ResponseBody 
    @Async  
    public List<ApiObject>  getApiData(){
        List<ApiObject>  apiDataList3=new List<ApiObject> ();
        //do the processing
        return apiDataList3;
    }
}

そこで、各ユーザーにレート制限を設定したいと考えました。すべてのユーザーが1分間に5つのリクエストのみ、またはそのようなリクエストをリクエストできるとします。各ユーザーのレート制限を設定して、1分あたり5つのAPI呼び出しのみを行う方法と、ユーザーがそれ以上要求した場合に429応答を返信できますか? IPアドレスが必要ですか?

どんな助けも大歓迎です。

17
Ricky

Springにはそのコンポーネントはありません。

  • ソリューションの一部としてビルドできます。フィルターを作成し、スプリングコンテキストに登録します。フィルターは着信コールをチェックし、時間枠内でユーザーごとの着信要求をカウントする必要があります。 トークンバケットアルゴリズム を使用します。これは最も柔軟性が高いためです。
  • 現在のソリューションに依存しないコンポーネントを構築できます。ジョブを実行するAPI Gatewayを作成します。 Zuulゲートウェイを拡張し、再びトークンバケットアルゴリズムを使用できます。
  • APIゲートウェイとして機能し、レート制限とスロットルをサポートするMulesoft ESBのような既に組み込まれているコンポーネントを使用できます。自分で使用したことはありません。
  • 最後に、レート制限やスロットルなどを備えたAPI Managerを使用できます。 MuleSoft、WSO2、3Scale、Kongなどをチェックアウトします(ほとんどはコストがかかり、一部はオープンソースであり、コミュニティエディションがあります)。
12
Daniel Cerecedo

Springには、すぐに使用できるレート制限はありません。

bucket4j-spring-boot-starter プロジェクトがあります。これは、 bucket4j ライブラリを使用してトークンバケツアルゴリズムを使用して、REST api。アプリケーションプロパティファイルを使用して設定できます IPアドレスまたはユーザー名に基づいてアクセスを制限する のオプションがあります。

ユーザーから独立して10秒以内に最大5つのリクエストを許可する簡単なセットアップの例:

bucket4j:
  enabled: true
  filters:
  - cache-name: buckets
    url: .*
    rate-limits:
    - bandwidths:
      - capacity: 5
    time: 10
    unit: seconds

Netflix Zuul を使用している場合、 Spring Cloud Zuul RateLimit を使用できます。これは、Consul、Redis、Spring Data、およびBucket4jのさまざまなストレージオプションを使用します。

7
Lukasz R.