Flutter速率限制插件shelf_rate_limiter的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter速率限制插件shelf_rate_limiter的使用

shelf_rate_limiter 是一个用于限制请求速率的Dart包,特别适用于基于Shelf框架的应用程序。它能够帮助你控制在固定时间范围内对后端服务的请求数量,从而防止过载或滥用。

使用方法

首先,在你的项目中添加 shelf_rate_limiter 依赖:

dependencies:
  shelf: ^1.0.0
  shelf_rate_limiter: ^0.1.0

然后,按照以下步骤设置速率限制器:

步骤 1: 创建存储和速率限制器实例

你可以选择不同的存储方式来保存请求计数信息,这里我们使用内存存储 MemStorage 作为示例:

import 'package:shelf_rate_limiter/shelf_rate_limiter.dart';
import 'package:shelf_rate_limiter/src/storage/memory_storage.dart';

final memoryStorage = MemStorage();
final rateLimiter = ShelfRateLimiter(
  storage: memoryStorage,
  duration: Duration(seconds: 60), // 时间窗口为60秒
  maxRequests: 10, // 每个IP地址最多允许10次请求
);

默认情况下,如果没有指定 durationmaxRequests,它们分别是60秒和5次请求。

步骤 2: 将速率限制器添加为中间件

接下来,你需要将速率限制器添加到你的请求处理管道中:

import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as shelf_io;

var handler = const shelf.Pipeline()
    .addMiddleware(shelf.logRequests()) // 可选:记录请求日志
    .addMiddleware(rateLimiter.rateLimiter())
    .addHandler(_echoRequest);

void main() async {
  var server = await shelf_io.serve(handler, 'localhost', 8080);
  server.autoCompress = true; // 启用内容压缩
  print('Serving at http://${server.address.host}:${server.port}');
}

shelf.Response _echoRequest(shelf.Request request) =>
    shelf.Response.ok('Request for "${request.url}"');

完整示例代码

以下是完整的示例代码,展示了如何集成 shelf_rate_limiter 到一个简单的服务器应用中:

import 'package:shelf/shelf.dart';
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_rate_limiter/shelf_rate_limiter.dart';
import 'package:shelf_rate_limiter/src/storage/memory_storage.dart';

void main() async {
  final memoryStorage = MemStorage();
  final rateLimiter = ShelfRateLimiter(
      storage: memoryStorage, duration: Duration(seconds: 60), maxRequests: 10);

  var handler = const Pipeline()
      .addMiddleware(logRequests())
      .addMiddleware(rateLimiter.rateLimiter())
      .addHandler(_echoRequest);

  var server = await shelf_io.serve(handler, 'localhost', 8080);

  // Enable content compression
  server.autoCompress = true;

  print('Serving at http://${server.address.host}:${server.port}');
}

Response _echoRequest(Request request) =>
    Response.ok('Request for "${request.url}"');

更多关于Flutter速率限制插件shelf_rate_limiter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter速率限制插件shelf_rate_limiter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何使用 shelf_rate_limiter 插件的示例代码。shelf_rate_limiter 是一个用于 Dart 的 Shelf 服务器的速率限制中间件,可以帮助你限制客户端对服务器的请求频率。

首先,确保你已经在你的 pubspec.yaml 文件中添加了 shelf_rate_limiter 依赖:

dependencies:
  shelf: ^1.0.0
  shelf_rate_limiter: ^2.0.0

然后,运行 flutter pub get 来获取依赖。

接下来是一个简单的示例,展示如何使用 shelf_rate_limiter 来限制请求速率:

import 'dart:io';
import 'package:shelf/shelf.dart';
import 'package:shelf_rate_limiter/shelf_rate_limiter.dart';

void main() {
  // 创建一个基本的 Shelf 处理器
  var handler = (Request request) async {
    return Response.ok('Hello, world!');
  };

  // 配置速率限制器,例如每分钟5个请求
  var rateLimiter = RateLimiter(
    limits: [
      Limit.perMinute(5),
    ],
    keyGetter: (request) => request.remoteAddress.toString(), // 使用客户端IP作为标识
  );

  // 使用速率限制中间件包装处理器
  var limitedHandler = rateLimiter.middleware(handler);

  // 创建 Shelf 服务器并运行
  var server = await shelfListenAndServe(
    'localhost', 8080,
    limitedHandler,
  );

  print('Serving at http://${server.address.host}:${server.address.port}');
}

在这个示例中:

  1. 我们首先导入了必要的包。
  2. 创建了一个基本的 handler 函数,该函数对每个请求返回 “Hello, world!”。
  3. 配置了一个 RateLimiter,设置了每分钟最多5个请求的限制,并使用客户端的IP地址作为请求的标识。
  4. 使用 rateLimiter.middleware 方法将速率限制中间件包装到我们的处理器上。
  5. 最后,创建并启动了一个 Shelf 服务器,监听 localhost 的8080端口。

当你运行这个程序并尝试对服务器发送超过限制的请求时,你将收到一个 429 Too Many Requests 的响应。

你可以根据实际需要调整速率限制策略和 keyGetter 函数,例如使用客户端的用户ID或其他唯一标识符来控制请求速率。

回到顶部