java如何实现单机接口限流
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要为大家展示了"java如何实现单机接口限流",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java如何实现单机接口限流"这篇文章吧。简单说就是设
千家信息网最后更新 2026年10月31日java如何实现单机接口限流
这篇文章主要为大家展示了"java如何实现单机接口限流",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java如何实现单机接口限流"这篇文章吧。
简单说就是设定某个接口一定时间只接受固定次数的请求,比如/add接口1秒最多接收100次请求,多的直接拒绝,这个问题很常见,场景也好理解,直接上代码:
/** * 单机限流 */@Slf4jpublic class FlowLimit { //接口限流上限值和限流时间缓存 private static Cache localCache = CacheBuilder.newBuilder().maximumSize(100) .expireAfterWrite(1000, TimeUnit.MILLISECONDS).build(); //每个接口的上限缓存 private static Map maxFlowLimitMap = new ConcurrentHashMap<>(); private static final FlowLimit instance = new FlowLimit(); //这块的目的是初始化每个接口的上限,下面的变量:apiFlowLimitConfigure //实际使用的时候应该是从db或者其他地方获取设置的每个接口的限流上限值, //这样可以动态的调整接口上限,比如直接修改db,不用发布,就可以调整接口限流值 static { new ScheduledThreadPoolExecutor(1, runnable -> { Thread thread = new Thread(runnable, "api-flowLimit-configure");// thread.setDaemon(true); return thread; }).scheduleAtFixedRate(() -> { try { String apiFlowLimitConfigure = "{\"doAdd\":100}"; //表示/doAdd接口1秒接受100次请求 Map mapObj = JSONObject.parseObject(apiFlowLimitConfigure, Map.class); if(mapObj != null){ mapObj.forEach((key, value) -> { if(value != null){ instance.setMaxFlowLimit(key.toString(), new Long(value.toString())); }else{ log.warn(key + " - 设置接口限流发现限流值为空,设置默认值"); instance.setMaxFlowLimit(key.toString(), 100L); } }); } } catch (Exception e) { log.error("设置接口限流出现异常{}", e); } }, 0, 3, TimeUnit.SECONDS); } public static FlowLimit getInstance() { return instance; } private FlowLimit setMaxFlowLimit(String key, Long maxFlowLimit) { maxFlowLimitMap.put(key, maxFlowLimit); return this; } public Boolean isAvailable(String key) { return checkAvailable(key, 1L); } public Boolean isAvailable(String key, Long incrNum) { return checkAvailable(key, incrNum); } private Boolean checkAvailable(String key, Long incrNum){ Long maxFlowLimit = maxFlowLimitMap.get(key); if (null == maxFlowLimit || maxFlowLimit == 0) { return true; } if (incrAndGet(key, incrNum) <= maxFlowLimit.longValue()) { return true; } else { return false; } } private long incrAndGet(String key, final long n) { try { return localCache.get(key, new Callable() { @Override public AtomicLong call() throws Exception { return new AtomicLong(0); } }).addAndGet(n); } catch (Exception e) { log.error(e.getMessage(), e); } return 0; } public long get(String key) { return incrAndGet(key, 0); }} 上面这个就是单机限流逻辑,代码不难,感觉没必要使用ConcurrentHashMap,不过感觉无所谓了
这段代码只需要加在需要限流的接口前面:
@GetMapping("doAdd")public Boolean doAdd(){ FlowLimit instance = FlowLimit.getInstance(); //单例获取 //查看当前的/doAdd接口是否触发了限流 Boolean flowLimitFlag = instance.isAvailable("doAdd"); if(!flowLimitFlag){ log.warn("触发限流,拒绝请求"); return false; } //doAdd() return true;}调用实例如上
上面这个限流其实是有一定问题的:比如你限定10秒钟1000次,在第9.9秒的时候,突然进来1000个请求,然后第10.1秒的时候,攻击者,又进来1000次请求,这样,0.2秒之内,进来2000次请求。。。
所以这个时候就需要令牌桶或者其他算法了,其他算法后面再写
以上是"java如何实现单机接口限流"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
接口
单机
时候
上限
代码
内容
篇文章
就是
感觉
时间
算法
缓存
问题
限值
流上
学习
帮助
调整
必要
无所谓
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
南京欣网互联网络科技
互联网科技公司简介
深圳九邦互联网科技有限公司
互联网巨头科技公司
深圳天众互联网科技公司
互联网科技汛
哈尔滨秒房互联网科技有限公司
玖二柒互联网科技公司待遇
互联网时代科技改变生活
互联网科技创新服务
受益于互联网科技的高速发展
互联网金融科技元年
互联网金融科技公司的优势
半导体行业属于互联网高科技类吗
易企秀互联网科技是做什么的
吉林省码上互联网科技电话
中国互联网公司的科技投入
第三届互联网大会安防黑科技
保山浩联互联网科技有限公司
互联网的黑科技实验室
湖南永感互联网科技有限公司
中国互联网科技工作委员会毛军
科技互联网政务服务
喔噻互联网科技
互联网科技公司怎么样
奇士达互联网科技
受益于互联网科技的高速发展
宇信科技在杭州互联网排第几
重庆科技产业互联网有哪些
互联网高科技绘画