多くの着信リクエスト呼び出しを処理する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アドレスが必要ですか?
どんな助けも大歓迎です。
Springにはそのコンポーネントはありません。
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のさまざまなストレージオプションを使用します。