几行代码实现限流,实用又简单

​场景

依赖系统脆弱    

    自己的系统依赖别人的系统很脆弱,支持不了高qps的请求,比如一下高计算量的AI系统,或者一个高计算量的数据系统。这里都是作者经历过的。悄悄告诉你,你要是把别人系统打挂了,锅是你背的。哈哈哈哈。所以一些基本的限流操作要学会。

 

自己系统计算量大,逻辑复杂还需要防止恶意请求

    作者也经历过,自己的系统真的太复杂了,毕竟需要一定的安全性,不能直接让别人请求,这个时候一般会在前面加一个服务,并且加上限流操作以及一些权限校验什么的,成功了之后再去请求后面服务。

 

 

怎么快速实现一个呢??

你看下面实现。

/** * @author JZWen * @date 2020/11/26 */public class GlobalLimiter {    //随着线上的机子量变化需要修改限流数,目前是10秒3个请求    private static volatile int permit = 3;    private Map<Long, Integer> rate = new ConcurrentHashMap<>(500);    public boolean limit() {        long secondTime = System.currentTimeMillis() / 10000;        synchronized (GlobalLimiter.class) {            Integer count = rate.get(secondTime);            if (count == null) {                rate.put(secondTime, 1);                rate.remove(secondTime - 3);                System.out.println("开始-------count :" + count + 1);                return true;            }                        if (count + 1 > permit) {                System.out.println("限流了 -------" + count + 1);                return false;            }            rate.put(secondTime, count + 1);            System.out.println("通过了-------" + count + 1);            return true;        }    }}

 

代码分层编写一下啊

 

/** * @author JZWen * @date 2020/11/26 */public interface LimiterOverflowValidate {    boolean tryAcquire();}
/** * @author JZWen * @date 2020/11/26 */@Servicepublic class RateLimiterOverflowValidate implements LimiterOverflowValidate {    private GlobalLimiter limiter = new GlobalLimiter();    @Override    public boolean tryAcquire() {        return limiter.limit();    }}

 

 

没骗你吧,真的就几行代码。使用  ConcurrentHashMap 存储请求数据,key =当前时间戳 (s) , value 当前时间戳的请求数,当然这个地方请求的维度可以自己把控的,比如说,我想按照请求方来限流,那个key就变成请求方id, value 可以包装一个类,Entry <key, Value> key =当前时间戳, value  = 当前时间戳的的请求数。随意搭配,但是记得remove调里面数据。要不然这个Map 会越来越大。打满内存会。

 

 

 

等你很久

你还没来

我都已习惯了等你

 

 

欢迎关注我,一起成为一个有趣的程序员

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值