# Smart-Rate-Limiter
**Repository Path**: lc_sf/smart-rate-limiter
## Basic Information
- **Project Name**: Smart-Rate-Limiter
- **Description**: 智能限流器 - 一个功能强大、易于使用的 Spring Boot 限流组件,支持多种算法、多维度限流和动态配置管理。
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-08-21
- **Last Updated**: 2025-08-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 🚀 Smart Rate Limiter
[](https://search.maven.org/search?q=g:%22io.github%22%20AND%20a:%22smart-rate-limiter-spring-boot-starter%22)
[](https://opensource.org/licenses/Apache-2.0)
[](https://www.oracle.com/java/)
[](https://spring.io/projects/spring-boot)
智能限流器 - 一个功能强大、易于使用的 Spring Boot 限流组件,支持多种算法、多维度限流和动态配置管理。
## ✨ 特性
- 🎯 **多种限流算法**:滑动窗口、固定窗口、令牌桶、漏桶
- 📊 **多维度限流**:IP、用户、全局、自定义维度
- 🔄 **动态配置**:运行时动态调整限流规则,无需重启
- 🎛️ **管理界面**:可选的 Web 管理控制台(需要启用)
- 🔧 **双存储支持**:Redis(分布式)+ 内存(单机)
- ⚡ **高性能**:基于 Lua 脚本,支持本地缓存
- 🛡️ **容错机制**:优雅降级,Redis 不可用时自动切换到内存模式
- 📝 **零配置**:开箱即用,也支持丰富的自定义配置
- 🔍 **Spring Expression**:支持 SpEL 表达式动态计算限流参数
## 🚀 快速开始
### 添加依赖
```xml
io.github
smart-rate-limiter-spring-boot-starter
1.0.0
```
### 基础使用
```java
@RestController
public class ApiController {
// 基础限流:每分钟10次
@RateLimit(permits = 10, window = 60)
@GetMapping("/api/data")
public String getData() {
return "Hello World";
}
// IP限流:每个IP每分钟5次
@RateLimit(
dimension = RateLimit.LimitDimension.IP,
permits = 5,
window = 60
)
@PostMapping("/api/upload")
public String upload() {
return "Upload success";
}
// 用户限流:每个用户每小时100次
@RateLimit(
dimension = RateLimit.LimitDimension.USER,
permits = 100,
window = 3600,
message = "用户请求过于频繁,请稍后再试"
)
@GetMapping("/api/user/profile")
public String getUserProfile() {
return "User profile";
}
}
```
**就这么简单!无需任何配置,限流功能立即生效。**
## 📋 目录
- [安装配置](#安装配置)
- [基础使用](#基础使用)
- [限流算法](#限流算法)
- [多维度限流](#多维度限流)
- [动态配置](#动态配置)
- [管理界面](#管理界面)
- [高级配置](#高级配置)
- [最佳实践](#最佳实践)
- [故障排除](#故障排除)
## 📋 环境要求
- **Java**: 17+
- **Spring Boot**: 3.x
- **Redis**: 3.2+(可选,用于分布式部署)
## 🔧 安装配置
### 单机模式(默认)
零配置即可使用,使用内存存储:
```yaml
# 无需任何配置!
```
### 分布式模式(推荐生产环境)
```yaml
# application.yml
spring:
data:
redis:
host: localhost
port: 6379
password: your-password
smart:
rate-limiter:
storage-type: redis # 使用 Redis 存储
```
### 管理界面(可选)
```yaml
# 启用管理界面
rate-limiter:
admin:
enabled: true
username: admin
password: admin123
base-path: /admin/rate-limiter
```
访问:`http://localhost:8080/admin/rate-limiter`
## 🎯 限流算法
### 支持的算法
| 算法 | 描述 | 适用场景 |
|------|------|----------|
| `SLIDING_WINDOW` | 滑动时间窗口(默认) | 最精确,适合大多数场景 |
| `FIXED_WINDOW` | 固定时间窗口 | 简单高效,允许短时突发 |
| `TOKEN_BUCKET` | 令牌桶 | 允许突发流量,平滑限流 |
| `LEAKY_BUCKET` | 漏桶 | 严格限制流量速率 |
### 使用示例
```java
// 使用令牌桶算法,允许突发流量
@RateLimit(
permits = 10,
window = 60,
algorithm = RateLimit.LimitAlgorithm.TOKEN_BUCKET,
bucketCapacity = 20 // 桶容量
)
@GetMapping("/api/burst")
public String handleBurst() {
return "OK";
}
// 使用漏桶算法,严格限制速率
@RateLimit(
permits = 5,
window = 60,
algorithm = RateLimit.LimitAlgorithm.LEAKY_BUCKET
)
@PostMapping("/api/strict")
public String strictLimit() {
return "OK";
}
```
## 🎨 多维度限流
### 限流维度
| 维度 | 说明 | 限流键 |
|------|------|--------|
| `GLOBAL` | 全局限流 | 方法签名 |
| `IP` | IP 地址限流 | IP + 方法签名 |
| `USER` | 用户限流 | 用户ID + 方法签名 |
| `CUSTOM` | 自定义维度 | SpEL 表达式结果 |
### 使用示例
```java
// 全局限流:所有用户共享配额
@RateLimit(
dimension = RateLimit.LimitDimension.GLOBAL,
permits = 1000,
window = 60
)
@GetMapping("/api/global")
public String globalEndpoint() {
return "OK";
}
// 自定义维度:按租户限流
@RateLimit(
dimension = RateLimit.LimitDimension.CUSTOM,
customKeyExpression = "#request.getHeader('tenant-id')",
permits = 100,
window = 60
)
@GetMapping("/api/tenant")
public String tenantEndpoint(HttpServletRequest request) {
return "OK";
}
// 多重限流:同时应用多个限流规则
@MultiRateLimit({
@RateLimit(dimension = RateLimit.LimitDimension.IP, permits = 10, window = 60),
@RateLimit(dimension = RateLimit.LimitDimension.USER, permits = 100, window = 3600),
@RateLimit(dimension = RateLimit.LimitDimension.GLOBAL, permits = 10000, window = 60)
})
@PostMapping("/api/multi")
public String multiLimit() {
return "OK";
}
```
## ⚙️ 动态配置
### 运行时调整
无需重启应用即可动态调整限流规则:
```java
@Autowired
private DynamicConfigService configService;
// 动态添加限流规则
DynamicRateLimitConfig config = new DynamicRateLimitConfig();
config.setPermits(20);
config.setWindow(60);
config.setDimension("IP");
configService.saveDynamicConfig("com.example.Controller.method", config, "admin");
// 动态删除限流规则
configService.deleteDynamicConfig("com.example.Controller.method", "admin");
```
### 配置优先级
1. **动态配置**(最高优先级)
2. **注解配置**
3. **默认配置**(最低优先级)
## 🎛️ 管理界面
启用管理界面后,可以通过 Web 控制台管理限流规则:
```yaml
rate-limiter:
admin:
enabled: true # 启用管理界面
username: admin # 登录用户名
password: admin123 # 登录密码
base-path: /admin/rate-limiter # 访问路径
session-timeout: 30 # 会话超时(分钟)
logging:
file-enabled: true # 启用操作日志
file-path: ./logs/rate-limiter/config-operations.log
```
### 功能特性
- 📊 **实时监控**:查看限流规则和统计信息
- ⚙️ **配置管理**:动态添加、修改、删除限流规则
- 🔍 **接口发现**:自动发现应用中的 API 接口
- 📝 **操作日志**:记录配置变更历史
访问地址:`http://localhost:8080/admin/rate-limiter`
## 🔧 高级配置
### 完整配置示例
```yaml
smart:
rate-limiter:
# 基础配置
enabled: true
storage-type: redis # redis, memory, hybrid
default-algorithm: sliding-window # 默认算法
# 缓存配置
cache:
enabled: true
max-size: 10000
expire-after-write: PT1M # ISO-8601 Duration格式
expire-after-access: PT5M
# Redis 配置
redis:
key-prefix: "rate_limit:"
key-separator: ":"
timeout: PT1S
use-lua-scripts: true
database: 0
# 内存存储配置
memory:
max-size: 100000
expire-after-access: PT10M
cleanup-interval: PT1M
# 容错配置
fallback:
on-error: allow # allow, reject
on-redis-unavailable: memory # memory, allow_all, reject_all
max-errors: 5
recovery-interval: PT1M
# 监控配置
monitoring:
enabled: true
include-detailed-tags: true
# 管理界面配置
rate-limiter:
admin:
enabled: true
base-path: /admin/rate-limiter
username: admin
password: admin123
session-timeout: 30
# 安全配置
security:
enable-header-check: false
allowed-ips: "127.0.0.1,192.168.1.*"
# 日志配置
logging:
file-enabled: true
file-path: ./logs/rate-limiter/operations.log
# 扫描配置
scanning:
strategy: SYNC # SYNC, ASYNC, DISABLED
async-delay-minutes: 3
```
### 自定义组件
```java
// 自定义用户ID解析器
@Component
public class CustomUserIdResolver implements UserIdResolver {
@Override
public String resolveUserId(HttpServletRequest request) {
return request.getHeader("X-User-ID");
}
}
// 自定义IP解析器
@Component
public class CustomIpResolver implements IpResolver {
@Override
public String resolveIp(HttpServletRequest request) {
// 处理代理情况
String xForwardedFor = request.getHeader("X-Forwarded-For");
return xForwardedFor != null ? xForwardedFor.split(",")[0]
: request.getRemoteAddr();
}
}
```
## 💡 最佳实践
### 1. 存储选择
- **单机应用**:使用 `memory` 存储
- **分布式应用**:使用 `redis` 存储
- **混合场景**:使用 `hybrid` 存储
### 2. 算法选择
- **大多数场景**:使用 `SLIDING_WINDOW`(默认)
- **允许突发**:使用 `TOKEN_BUCKET`
- **严格限制**:使用 `LEAKY_BUCKET`
- **简单场景**:使用 `FIXED_WINDOW`
### 3. 限流策略
```java
// ✅ 推荐:分层限流
@MultiRateLimit({
@RateLimit(dimension = IP, permits = 100, window = 60), // 防刷
@RateLimit(dimension = USER, permits = 1000, window = 3600), // 用户配额
@RateLimit(dimension = GLOBAL, permits = 10000, window = 60) // 系统保护
})
@PostMapping("/api/important")
public String importantApi() {
return "OK";
}
// ✅ 推荐:业务场景定制
@RateLimit(
permits = 1,
window = 300, // 5分钟内只能发送1次
dimension = RateLimit.LimitDimension.CUSTOM,
customKeyExpression = "#request.getParameter('phone')",
message = "验证码发送过于频繁,请5分钟后重试"
)
@PostMapping("/api/send-sms")
public String sendSms() {
return "OK";
}
```
### 4. 错误处理
```java
@ControllerAdvice
public class RateLimitExceptionHandler {
@ExceptionHandler(RateLimitException.class)
public ResponseEntity