iamavisek7/distributed-rate-limiter

GitHub: iamavisek7/distributed-rate-limiter

这是一个基于 Java 21、Spring Boot 和 Redis 构建的生产级分布式限流器,旨在防止服务过载、滥用行为并确保系统可靠性。

Stars: 0 | Forks: 0

# 分布式限流器 一个基于 Java 21、Spring Boot 和 Redis 构建的生产级分布式限流器。 ## 架构 ``` src/main/java/com/ratelimiter/ ├── RateLimiterApplication.java ├── algorithm/ │ ├── RateLimitAlgorithm.java ← strategy interface │ ├── FixedWindowAlgorithm.java ← implemented │ ├── SlidingWindowAlgorithm.java ← stub (TODO) │ └── TokenBucketAlgorithm.java ← stub (TODO) ├── controller/ │ └── RateLimiterController.java ← POST /api/v1/rate-limit/check ├── service/ │ └── RateLimiterService.java ← orchestrates rule + algorithm ├── repository/ │ ├── RateLimitRepository.java ← Redis abstraction │ └── RedisRateLimitRepository.java ← Lettuce/Spring Data impl ├── config/ │ ├── RedisConfig.java │ └── RateLimiterProperties.java ← YAML-bound rule config ├── dto/ │ ├── RateLimitRequest.java │ └── RateLimitResponse.java ├── model/ │ ├── Algorithm.java │ ├── RateLimitRule.java │ └── RateLimitResult.java ├── exception/ │ ├── GlobalExceptionHandler.java │ └── NoRuleFoundException.java └── metrics/ └── RateLimiterMetrics.java ← Micrometer Prometheus counters ``` ## API ### 检查限流 ``` POST /api/v1/rate-limit/check Content-Type: application/json { "clientId": "my-service", "endpoint": "/api/orders" } ``` **响应 — 允许 (200)** ``` { "allowed": true, "remaining": 94, "retryAfterSeconds": 0, "appliedRule": "default:FIXED_WINDOW:100/60s" } ``` **响应 — 拒绝 (429)** ``` { "allowed": false, "remaining": 0, "retryAfterSeconds": 38, "appliedRule": "default:FIXED_WINDOW:100/60s" } ``` ## 本地运行 ### 使用 Docker Compose ``` docker compose up --build ``` 服务: - App: http://localhost:8080 - Prometheus: http://localhost:9090 ### 不使用 Docker ``` # 启动 Redis docker run -p 6379:6379 redis:7.2.4-alpine # 运行 app ./mvnw spring-boot:run ``` ## 测试 ``` # 仅运行 Unit tests ./mvnw test -pl . -Dtest="**/unit/**" # 所有测试(需要 Docker 用于 Testcontainers) ./mvnw verify ``` ## 指标 Prometheus counter: `rate_limiter_requests_total{clientId, algorithm, result}` 访问地址:`GET /actuator/prometheus` ## 添加新算法 1. 实现 `RateLimitAlgorithm` 并使用 `@Component` 注解 2. 从 `getType()` 返回正确的 `Algorithm` 枚举 3. Spring 会自动将其注册到 `RateLimiterService` 的算法映射中 4. 在 `application.yml` 的规则中添加该算法 ## 配置 ``` rate-limiter: default-algorithm: FIXED_WINDOW rules: - clientId: default algorithm: FIXED_WINDOW limitForPeriod: 100 limitRefreshPeriodSeconds: 60 - clientId: premium-client algorithm: FIXED_WINDOW limitForPeriod: 1000 limitRefreshPeriodSeconds: 60 ```
标签:API网关, Java 21, Letture, LLM调用限制, MacOS取证, Micrometer, Prometheus监控, Redis, REST API, Spring Boot, Spring Data Redis, 令牌桶算法, 公平调度, 分布式限流, 后端开发, 固定窗口算法, 微服务架构, 成本控制, 拒绝服务攻击防护, 搜索引擎查询, 暴力破解防护, 流量削峰, 流量控制, 滑动窗口算法, 熔断降级, 爬虫防护, 生产级代码, 系统稳定性, 自定义请求头, 请求拦截, 防止过载