本文主要是介绍几行代码实现限流,实用又简单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
场景
依赖系统脆弱
自己的系统依赖别人的系统很脆弱,支持不了高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
*/
@Service
public 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 会越来越大。打满内存会。
等你很久
你还没来
我都已习惯了等你
欢迎关注我,一起成为一个有趣的程序员
这篇关于几行代码实现限流,实用又简单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!