Springboot技术专家 从0到1基于模板模式实现自己的服务限流框架(上)

63 阅读2分钟

图片

限流算法对比表格

算法类型核心原理优势劣势适用场景
固定窗口将时间划分为固定长度窗口(如1秒),每个窗口内允许固定数量请求。- 实现简单 - 计算成本低- 窗口边界流量突刺(双倍流量风险) - 精度低简单低频控制(如短信验证码、低频接口)
滑动窗口将时间划分为多个子窗口,动态统计最近N个单位时间内的总请求量。- 流量控制更平滑 - 精度较高- 内存占用高(需维护子窗口) - 实现复杂度高高精度控制(如API网关、分布式服务)
令牌桶系统以恒定速率生成令牌到桶中,请求需获取令牌才能通过,允许突发消费。- 支持突发流量 - 弹性限流- 突发可能导致过载 - 时间精度依赖时钟同步允许突发的场景(如秒杀系统、网络流量整形)
漏桶请求像水一样进入漏桶,以恒定速率流出处理,强制平滑流量。- 绝对流量平滑 - 保护下游系统- 不支持突发 - 请求延迟可能较高恒定速率处理(如数据库写入、日志采集)

对比说明

  1. 流量突刺问题
    • 固定窗口在窗口切换时可能允许双倍流量(如1秒窗口最后100ms+下个窗口前100ms)
    • 滑动窗口通过子窗口划分避免该问题
    • 令牌桶允许突发但可控,漏桶完全平滑
  2. 典型应用
    • Nginx限流模块:固定窗口+滑动窗口
    • Guava RateLimiter:令牌桶
    • Kafka生产者:漏桶算法控制吞吐
    • Redis + Lua:滑动窗口(分布式场景)

选型建议

  1. 需要允许突发流量 → 令牌桶(如秒杀场景)
  2. 严格保护下游系统 → 漏桶(如数据库限流)
  3. 高精度控制 → 滑动窗口(如API网关)
  4. 简单快速实现 → 固定窗口(低频接口)

算法实现如下:

顶层接口

图片

抽象类,模板方法设计模式

图片

固定窗口算法实现

图片

滑动窗口算法实现

图片

漏斗算法实现

图片

令牌桶算法实现

图片

如何在在项目中使用限流算法,思路如下,自定义注解,利用Spring的AOP机制进行拦截

自定义注解

图片

AOP

图片

目前我们利用AOP与自己写的限流算法实现了一个限流框架,但是我们框架还有一下的不足。 

1.不支持分布式的限流算法 

2.不支持用户自定义限流算法

下一章我们继续完善我们框架

获取方式 扫码,关注后,


图片发送:002

**Springboot3

Springboot · 目录**

上一篇Springboot技术专家 从0到1基于模板模式实现自己的服务限流框架(下)