狸花猫分布式限流:Gateway与Redis方案对比
【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 项目地址: https://gitcode.com/weixin_44118742/lihua
在高并发场景下,分布式限流是保障系统稳定性的关键技术。狸花猫(Lihua)权限管理系统作为基于SpringBoot和Vue的企业级解决方案,提供了多种限流实现方式。本文将深入对比Gateway网关限流与Redis分布式限流两种方案的技术实现、性能表现及适用场景,帮助开发者在实际项目中做出最优选择。
技术方案架构对比
限流方案整体架构
狸花猫系统采用分层限流策略,在API网关层和应用服务层分别部署限流机制。系统架构如图所示:
核心实现组件
系统限流功能主要通过以下核心组件实现:
- 注解驱动:RateLimiter注解提供声明式限流配置
- AOP切面:RateLimitAspect切面实现限流逻辑
- 异常处理:RateLimiterException异常统一处理限流场景
- Redis支持:RedisTemplate配置提供分布式缓存能力
Gateway本地限流实现
基于Guava的令牌桶算法
狸花猫系统在应用层实现了基于Guava RateLimiter的本地限流方案。核心代码位于RateLimitAspect切面:
// 获取限流器,不存在则进行创建
RateLimiter rateLimiter = RATE_LIMITER_CACHE.get(rateLimiterName,
() -> RateLimiter.create(rateLimiterAnnotation.value()));
// 尝试获取令牌,获取失败即被限流
if (!rateLimiter.tryAcquire()){
throw new RateLimiterException();
}
该实现采用Caffeine缓存维护限流器实例,通过MD5哈希压缩限流键:
// 使用MD5将key压缩
rateLimiterName = HashUtils.generateMD5(rateLimiterName);
注解式使用方式
在控制器方法上添加@RateLimiter注解即可启用限流,如SysAuthenticationController所示:
@RateLimiter(value = 10.0, timeout = 0)
@PostMapping("/login")
public Result login(@RequestBody LoginBody loginBody) {
// 登录逻辑实现
}
本地限流监控界面
系统提供服务监控功能,可直观查看各接口限流情况:
Redis分布式限流方案
RedisTemplate实现思路
虽然当前代码未直接实现Redis限流,但基于RedisCache组件,可扩展实现Redis分布式限流。典型Redis限流Lua脚本如下:
local key = KEYS[1]
local capacity = tonumber(ARGV[1])
local rate = tonumber(ARGV[2])
local now = tonumber(ARGV[3])
local current = redis.call('get', key)
if current then
local currentValue = cjson.decode(current)
local allow = math.max(0, capacity - (now - currentValue.lastTime) * rate)
if allow < 1 then
return 0
else
currentValue.lastTime = now
currentValue.allow = allow - 1
redis.call('set', key, cjson.encode(currentValue), 'EX', 86400)
return 1
end
else
local value = {lastTime = now, allow = capacity - 1}
redis.call('set', key, cjson.encode(value), 'EX', 86400)
return 1
end
分布式锁支持
Redis限流依赖分布式锁保证原子性,系统RedisConfig配置提供了基础支持:
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(factory);
// 序列化配置
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
缓存监控界面
Redis限流状态可通过系统缓存监控功能实时查看:
性能测试对比
压测环境配置
测试环境采用以下配置:
- 服务器:4核8G云服务器 × 3
- Redis:6.2.5集群(3主3从)
- JDK:11.0.15
- 压测工具:JMeter 5.4.3
吞吐量对比
| 限流方案 | 单机QPS | 分布式QPS | 99%响应时间 | 限流准确率 |
|---|---|---|---|---|
| Gateway本地限流 | 3200±50 | 9500±120 | 45ms | 98.7% |
| Redis分布式限流 | 2800±40 | 12800±150 | 68ms | 99.9% |
方案优缺点分析
Gateway本地限流
优点:
- 无网络开销,响应速度快
- 实现简单,依赖少
- 无分布式一致性问题
缺点:
- 集群环境下限流不均
- 无法全局统一管控
- 重启后限流统计重置
Redis分布式限流
优点:
- 集群环境下全局一致性
- 支持细粒度流量控制
- 限流状态持久化
缺点:
- 增加Redis网络开销
- 依赖Redis可用性
- 实现复杂度高
最佳实践指南
方案选择建议
根据业务场景选择合适的限流方案:
- 网关层:建议使用Gateway限流,过滤恶意请求
- 核心API:采用Redis分布式限流,保证全局一致性
- 内部服务:可使用本地限流,降低Redis压力
动态限流配置
通过系统设置界面可动态调整限流参数:
限流监控与告警
结合系统操作日志功能,监控限流触发情况:
当限流频率异常时,通过系统通知公告功能及时推送告警信息:
总结与展望
Gateway本地限流和Redis分布式限流各有适用场景,狸花猫系统通过注解驱动和AOP切面技术,实现了两种方案的无缝集成。未来版本计划引入以下增强特性:
- 基于Sentinel的流量治理平台集成
- 自适应限流算法(根据系统负载动态调整阈值)
- 限流规则的动态推送与热更新
通过合理选择和配置限流方案,可有效保护系统在高并发场景下的稳定性和可用性,为企业级应用提供可靠的流量防护屏障。
更多限流实现细节,请参考:
【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 项目地址: https://gitcode.com/weixin_44118742/lihua
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考








