SpringBoot项⽬的限流
开发访问量⽐较⼤的系统是,爬⾍的⽬的就是解决访问量⼤的问题;缓存穿透是为了保护后端数据库查询服务;计数服务解决了接近真实访问量以及数据库服务的压⼒。
架构图
限流
就拿⼗万博客来说,如果存在热点⽂章,可能会有数⼗万级别的并发⽤户参与阅读。如果想让这些⽤户正常访问,⽆⾮就是加机器横向扩展各种服务,但凡事都有⼀个利益平衡点,有时候只需要少量的机器保证⼤部分⽤户在⼤部分时间可以正常访问即可。
亦或是,如果存在⼤量爬⾍或者恶意攻击,我们必须采取⼀定的措施来保证服务的正常运⾏。这时候我们就要考虑限流来保证服务的可⽤性,以防⽌⾮预期的请求对系统压⼒过⼤⽽引起的系统瘫痪。通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务。
限流算法
任何限流都不是漫⽆⽬的的,也不是⼀个开关就可以解决的问题,常⽤的限流算法有:令牌桶,漏桶。
令牌桶
令牌桶算法是⽹络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使⽤的⼀种算法。典型情况下,令牌桶算法⽤来控制发送到⽹络上的数据的数⽬,并允许突发数据的发送(百科)。
⽤户的请求速率是不固定的,这⾥我们假定为10r/s,令牌按照5个每秒的速率放⼊令牌桶,桶中最多存放20个令牌。仔细想想,是不是总有那么⼀部分请求被丢弃。
漏桶
漏桶算法的主要⽬的是控制数据注⼊到⽹络的速率,平滑⽹络上的突发流量。漏桶算法提供了⼀种机制,通过它,突发流量可以被整形以便为⽹络提供⼀个稳定的流量(百科)。
令牌桶是⽆论你流⼊速率多⼤,我都按照既定的速率去处理,如果桶满则拒绝服务。
应⽤限流
Tomcat
在Tomcat容器中,我们可以通过⾃定义线程池,配置最⼤连接数,请求处理队列等参数来达到限流的⽬的。
Tomcat默认使⽤⾃带的连接池,这⾥我们也可以⾃定义实现,打开/l⽂件,在Connector之前配置⼀个线程池:
name:共享线程池的名字。这是Connector为了共享线程池要引⽤的名字,该名字必须唯⼀。默认值:None;
namePrefix:在JVM上,每个运⾏线程都可以有⼀个name 字符串。这⼀属性为线程池中每个线程的name字符串设置了⼀个前缀,Tomcat将把线程号追加到这⼀前缀的后⾯。默认值:tomcat-exec-;
maxThreads:该线程池可以容纳的最⼤线程数。默认值:200;
maxIdleTime:在Tomcat关闭⼀个空闲线程之前,允许空闲线程持续的时间(以毫秒为单位)。只有当前活跃的线程数⼤于minSpareThread的值,才会关闭空闲线程。默认值:60000(⼀分钟)。
minSpareThreads:Tomcat应该始终打开的最⼩不活跃线程数。默认值:25。
配置Connector
executor:表⽰使⽤该参数值对应的线程池;
minProcessors:服务器启动时创建的处理请求的线程数;
springboot推荐算法maxProcessors:最⼤可以创建的处理请求的线程数;
acceptCount:指定当所有可以使⽤的处理请求的线程数都被使⽤时,可以放到处理队列中的请求数,超过这个数的请求将不予处理。
API限流
这⾥我们采⽤开源⼯具包guava提供的限流⼯具类RateLimiter进⾏API限流,该类基于"令牌桶算法",开箱即⽤。
⾃定义定义注解
⾃定义切⾯
业务实现:
分布式限流
Nginx
如何使⽤Nginx实现基本的限流,⽐如单个IP限制每秒访问50次。通过Nginx限流模块,我们可以设置⼀旦并发连接数超过我们的设置,将返回503错误给客户端。
配置f
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论