前言
在开发分布式高并发系统时有三把利器用来保护系统:缓存、降级、限流。
缓存
缓存的目的是提升系统访问速度和增大系统处理容量
降级
降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题解决后再打开
限流
限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理
本文主要讲的是api接口限流相关内容,虽然不是论述高并发概念中的限流, 不过道理都差不多。通过限流可以让系统维持在一个相对稳定的状态,为更多的客户提供服务。
api接口的限流主要应用场景有:
-
电商系统(特别是6.18、双11等)中的秒杀活动,使用限流防止使用软件恶意刷单;
-
各种基础api接口限流:例如天气信息获取,IP对应城市接口,百度、腾讯等对外提供的基础接口,都是通过限流来实现免费与付费直接的转换。
-
被各种系统广泛调用的api接口,严重消耗网络、内存等资源,需要合理限流。
api限流实战
一、SpringBoot中集成Redis
SpringBoot中集成Redis相对比较简单,步骤如下:
1.1 引入Redis依赖
<!--springboot redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1.2 在application.yml中配置Redis
spring:
redis:
database: 3 # Redis数据库索引(默认为0)
host: 127.0.0.1 # Redis服务器地址
port: 6379 # Redis服务器连接端口
password: 123456 # Redis服务器连接密码(默认为空)
timeout: 2000 # 连接超时时间(毫秒)
jedis:
pool:
max-active: 200 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 20 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中