# distributed-limit-api **Repository Path**: smilehappiness/distributed-limit-api ## Basic Information - **Project Name**: distributed-limit-api - **Description**: 基于SpringBoot + Redis,实现分布式环境下,Api方法的限流 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-07-18 - **Last Updated**: 2022-11-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 1 前言 随着时代的发展,互联网也发生了巨大的变化。其中重要的一个变化时,`为了应对高流量,服务的架构从集中式架构,演变成了分布式架构`。 什么是分布式架构? 简单来说,就是之前的`一个单体应用(后台管理系统)`,通过拆分,`拆分成用户中心、产品中心、客户中心等多个小应用服务`,这种`把一个大的单体应用项目,拆分成多个小应用项目的方式,就是分布式系统应用架构`。 本文将以一种最高效的方式,实现分布式环境下,接口方法的限流。 # 2 为什么要对Api接口限流 为了满足各种应用场景,有时候不得不对接口Api进行限流。比如说:短信服务,供应商可能会要求每秒访问不超过400条,如果超过了这个访问量,请求就会被供应商拒绝,从而导致漏发短信。 还有的接口,第三方Api会做限制,他们为了限制访问,设定一分钟只能请求接口20次,超过了就会超时或者响应异常。 总而言之,限流,在好多场景用的还是挺多的。 # 3 基于Spring Boot + Redis实现限流 3.1 实现的思路 思路: 借助于Redis的INCR操作来实现Limit限流 * 将INCR key中储存的数字值增一,如果key不存在,那么key的值会先被初始化为 0 ,然后再执行INCR操作。 如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误,本操作的值限制在 64 位(bit)有符号数字表示之内。 * 当API被调用时,在调用API前进行INCR key,key可以是ip地址相关,用户相关,业务参数相关,或是全局的一个key。如果返回值为1,则表示刚开始调用,赋予key过期时间,然后判断返回值是否大于设定的Limit限流数量,如果大于抛异常或者阻塞重试。 # 4 技术栈 本篇主要使用的是Spring Boot + Redis,所以小伙伴需要有Redis服务环境,才能运行此程序。 windows下安装redis后,使用resources目录下redisStart.bat启动脚本,把安装目录地址改成自己的地址,即可启动redis服务。 # 5 设计 本文结合简单的场景示例,来演示如何对一个业务方法进行限流。主要是定义了ApiLimit注解,然后使用切面的方式对需要拦截的方法进行拦截,从而达到限流的效果。 配合test下的测试用例,可以实现需要的效果。 有需要的小伙伴,可以对照着博客地址:[https://blog.csdn.net/smilehappiness/article/details/107170309](https://blog.csdn.net/smilehappiness/article/details/107170309),结合此项目,就可以运用到实际开发中。