狸花猫分布式限流:Gateway与Redis方案对比

狸花猫分布式限流:Gateway与Redis方案对比

【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 【免费下载链接】lihua 项目地址: https://gitcode.com/weixin_44118742/lihua

在高并发场景下,分布式限流是保障系统稳定性的关键技术。狸花猫(Lihua)权限管理系统作为基于SpringBoot和Vue的企业级解决方案,提供了多种限流实现方式。本文将深入对比Gateway网关限流与Redis分布式限流两种方案的技术实现、性能表现及适用场景,帮助开发者在实际项目中做出最优选择。

技术方案架构对比

限流方案整体架构

狸花猫系统采用分层限流策略,在API网关层和应用服务层分别部署限流机制。系统架构如图所示:

mermaid

核心实现组件

系统限流功能主要通过以下核心组件实现:

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分布式QPS99%响应时间限流准确率
Gateway本地限流3200±509500±12045ms98.7%
Redis分布式限流2800±4012800±15068ms99.9%

方案优缺点分析

Gateway本地限流

优点

  • 无网络开销,响应速度快
  • 实现简单,依赖少
  • 无分布式一致性问题

缺点

  • 集群环境下限流不均
  • 无法全局统一管控
  • 重启后限流统计重置
Redis分布式限流

优点

  • 集群环境下全局一致性
  • 支持细粒度流量控制
  • 限流状态持久化

缺点

  • 增加Redis网络开销
  • 依赖Redis可用性
  • 实现复杂度高

最佳实践指南

方案选择建议

根据业务场景选择合适的限流方案:

  1. 网关层:建议使用Gateway限流,过滤恶意请求
  2. 核心API:采用Redis分布式限流,保证全局一致性
  3. 内部服务:可使用本地限流,降低Redis压力

动态限流配置

通过系统设置界面可动态调整限流参数:

设置页

限流监控与告警

结合系统操作日志功能,监控限流触发情况:

操作日志

当限流频率异常时,通过系统通知公告功能及时推送告警信息:

通知公告

总结与展望

Gateway本地限流和Redis分布式限流各有适用场景,狸花猫系统通过注解驱动和AOP切面技术,实现了两种方案的无缝集成。未来版本计划引入以下增强特性:

  1. 基于Sentinel的流量治理平台集成
  2. 自适应限流算法(根据系统负载动态调整阈值)
  3. 限流规则的动态推送与热更新

通过合理选择和配置限流方案,可有效保护系统在高并发场景下的稳定性和可用性,为企业级应用提供可靠的流量防护屏障。

更多限流实现细节,请参考:

【免费下载链接】lihua 狸花猫是一款基于 SpringBoot 和 Vue 的权限管理系统 【免费下载链接】lihua 项目地址: https://gitcode.com/weixin_44118742/lihua

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值