6 个版本 (3 个重大更改)

0.4.0 2024 年 8 月 7 日
0.3.1 2024 年 1 月 21 日
0.2.1 2022 年 4 月 18 日
0.1.1 2022 年 4 月 15 日

#101 in HTTP 服务器

Download history 237/week @ 2024-04-27 246/week @ 2024-05-04 461/week @ 2024-05-11 232/week @ 2024-05-18 271/week @ 2024-05-25 425/week @ 2024-06-01 449/week @ 2024-06-08 291/week @ 2024-06-15 262/week @ 2024-06-22 210/week @ 2024-06-29 213/week @ 2024-07-06 272/week @ 2024-07-13 211/week @ 2024-07-20 353/week @ 2024-07-27 346/week @ 2024-08-03 215/week @ 2024-08-10

每月下载 1,143
3 crates 中使用

MIT/Apache

60KB
1K SLoC

Actix Extensible Rate Limit

Build status crates.io docs.rs

为 actix-web 尝试实现更灵活的速率限制中间件

允许

  • 从请求上下文中派生自定义速率限制键。
  • 使用动态速率限制和由请求上下文确定的间隔。
  • 使用自定义后端(存储 & 算法)
  • 设置自定义 429 响应。
  • 根据速率限制结果转换响应头(例如 x-ratelimit-remaining)。
  • 根据响应代码回滚速率限制计数。

提供后端

后端 算法 存储
InMemoryBackend 固定窗口 Dashmap
RedisBackend 固定窗口 Redis

入门

use actix_web::{App, HttpServer};
use actix_extensible_rate_limit::{
    backend::{memory::InMemoryBackend, SimpleInputFunctionBuilder},
    RateLimiter,
};
use std::time::Duration;

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    // A backend is responsible for storing rate limit data, and choosing whether to allow/deny requests
    let backend = InMemoryBackend::builder().build();

    HttpServer::new(move || {
        // Assign a limit of 5 requests per minute per client ip address
        let input = SimpleInputFunctionBuilder::new(Duration::from_secs(60), 5)
            .real_ip_key()
            .build();
        let middleware = RateLimiter::builder(backend.clone(), input)
            .add_headers()
            .build();
        App::new().wrap(middleware)
    })
    .bind("127.0.0.1:8080")?
    .run()
    .await
}

试试看

$ curl -v http://127.0.0.1:8080
*   Trying 127.0.0.1:8080...
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:8080
> User-Agent: curl/7.83.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< content-length: 0
< x-ratelimit-limit: 5
< x-ratelimit-reset: 60
< x-ratelimit-remaining: 4
< date: Sun, 21 Jan 2024 16:52:27 GMT
<
* Connection #0 to host 127.0.0.1 left intact

依赖项

~15–26MB
~471K SLoC