java每秒限流_Java 对IP请求进行限流.

本文介绍了在高并发系统中,限流作为保护措施的重要性,并详细讲解了三种限流算法:计数器、漏桶和令牌桶。重点探讨了Java中使用Guava的RateLimiter实现IP级别的令牌桶限流,每秒限制每个IP调用API两次,通过缓存管理和定时清理策略确保限流效果。
摘要由CSDN通过智能技术生成

高并发系统下, 有三把利器 缓存 降级 限流.

缓存: 将常用数据缓存起来, 减少数据库或者磁盘IO

降级: 保护核心系统, 降低非核心业务请求响应

限流: 在某一个时间窗口内对请求进行限速, 保护系统

本文主要介绍限流, 常见限流算法中又分为计数器算法, 漏桶算法, 令牌桶算法.

计数器算法

比较简单, 直接用一个map + counter即可实现. 请求来了, 以IP为key,

查询下之前响应次数, 如果调用次数超出MAX_COUT, 返回失败, 属于简单粗暴型选手.

漏桶算法

请求全部进入漏桶, 漏桶恒定速率输出反馈. 这样可以保证数据传输平滑,

但是无法预防突发大量请求, 一秒来了100个请求, 都要阻塞排队, 从小水管输出数据.

9a7391d93b90b2c94b18992f6e94b856.png

令牌桶算法

令牌桶是以固定速度往桶里存令牌, 例如一秒存1000个令牌, 业务请求来了, 直接从桶里获取令牌响应输出.

跟漏桶的差异在于, 他可以预存令牌, 如果一秒钟来了100个请求, 桶里有100个令牌,

那么可以立刻响应给客户端, 而不是排队输出.

31dde0a5bf82c5485e4d6049608b5b27.png

令牌桶的实现

guava中提供了令牌桶的一个封装实现RateLimiter, 可以直接调用, 省的我们自己包装ConcurrentHashMap + Timer.

我们预设的场景是服务器端提供一个API供不同客户端查询, 要限流每个IP每秒只能调用两次该API.

首先要定义一个服务器端的缓存, 定期清理即可, 缓存 IP : 令牌桶

// 根据IP分不同的令牌桶, 每天自动清理缓存

private static LoadingCache caches = CacheBuilder.newBuilder()

.maximumSize(1000)

.expireAfterWrite(1, TimeUnit.DAYS)

.build(new CacheLoader() {

@Override

public RateLimiter load(String key) throws Exception {

// 新的IP初始化 (限流每秒两个令牌响应)

return RateLimiter.create(2);

}

});

然后在业务代码中进行限流调用

private static void login(int i) throws ExecutionException {

// 模拟IP的key

String ip = String.valueOf(i).charAt(0) + "";

RateLimiter limiter = caches.get(ip);

if (limiter.tryAcquire()) {

System.out.println(i + " success " + new SimpleDateFormat("HH:mm:ss.sss").format(new Date()));

} else {

System.out.println(i + " failed " + new SimpleDateFormat("HH:mm:ss.sss").format(new Date()));

}

}

模拟客户端调用

for (int i = 0; i < 1000; i++) {

// 模拟实际业务请求

Thread.sleep(100);

login(i);

}

完整代码

public class doLimit {

// 根据IP分不同的令牌桶, 每天自动清理缓存

private static LoadingCache caches = CacheBuilder.newBuilder()

.maximumSize(1000)

.expireAfterWrite(1, TimeUnit.DAYS)

.build(new CacheLoader() {

@Override

public RateLimiter load(String key) throws Exception {

// 新的IP初始化 (限流每秒两个令牌响应)

return RateLimiter.create(2);

}

});

public static void main(String[] args) throws InterruptedException, ExecutionException {

for (int i = 0; i < 1000; i++) {

// 模拟实际业务请求

Thread.sleep(100);

login(i);

}

}

private static void login(int i) throws ExecutionException {

// 模拟IP的key

String ip = String.valueOf(i).charAt(0) + "";

RateLimiter limiter = caches.get(ip);

if (limiter.tryAcquire()) {

System.out.println(i + " success " + new SimpleDateFormat("HH:mm:ss.sss").format(new Date()));

} else {

System.out.println(i + " failed " + new SimpleDateFormat("HH:mm:ss.sss").format(new Date()));

}

}

}

java 模拟http请求,通过流(stream)的方式&comma;发送json数据和文件

发送端: /** * 以流的方式 * 发送文件和json对象 * * @return */ public static String doPostFileStreamAndJsonObj(String ...

高可用服务设计之二:Rate limiting 限流与降级

限流降级神器,带你解读阿里巴巴开源 Sentinel 实现原理

Sentinel 是阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度来帮助用户保护服务的稳定性. 大家可能会问:Se ...

【Distributed】限流技巧

一.概述 1.1 高并发服务限流特技 1.2 为什么要互联网项目要限流 1.3 高并发限流解决方案 二.限流算法 2.1 计数器 2.2 滑动窗口计数 2.3 令牌桶算法 使用RateLimiter实 ...

WebApiThrottle限流框架使用手册

阅读目录: 介绍 基于IP全局限流 基于IP的端点限流 基于IP和客户端key的端点限流 IP和客户端key的白名单 IP和客户端key自定义限制频率 端点自定义限制频率 关于被拒请求的计数器 在we ...

前后端分离djangorestframework——限流频率组件

频率限制 什么是频率限制 目前我们开发的都是API接口,且是开房的API接口.传给前端来处理的,也就是说,只要有人拿到这个接口,任何人都可以通过这个API接口获取数据,那么像网络爬虫的,请求速度又快, ...

spring cloud网关通过Zuul RateLimit 限流配置

目录 引入依赖 配置信息 RateLimit源码简单分析 RateLimit详细的配置信息解读 在平常项目中为了防止一些没有token访问的API被大量无限的调用,需要对一些服务进行API限流.就好比 ...

限流&lpar;四&rpar;nginx接入层限流

一.nginx限流模块 接入层指的是请求流量的入口,我们可以在这里做很多控制,比如:负载均衡,缓存,限流等. nginx中针对限流有两个模块可以处理: 1)ngx_http_limit_req_mod ...

Spring Cloud Alibaba &vert; Sentinel&colon; 服务限流基础篇

目录 Spring Cloud Alibaba | Sentinel: 服务限流基础篇 1. 简介 2. 定义资源 2.1 主流框架的默认适配 2.2 抛出异常的方式定义资源 2.3 返回布尔值方式定 ...

随机推荐

获取本机IP地址

这里有两种方法: //获取本机IP - (NSString *)localIPAddress { NSString *localIP = nil; struct ifaddrs *addrs; ) { ...

【WP 8&period;1开发】电子罗盘

罗盘,估计也不用我过多介绍,学过初中物理的都知道,不管是指南针,还是指北针,其本质就是用来辨别方向的. 操作电子罗盘伟感器也不复杂,主要就是两个角度: 1.当前方向与磁北的夹角: 2.当前方向与地北的 ...

eclipse中本地项目怎么和svn中的项目关联?

网速不好,通过别的方式把项目下载到本地硬盘,然后导入eclipse,代码修改后怎么提交到svn呢? 这个纠结了好久的问题... 首先要确定eclipse中安装了svn插件. 然后在“svn资源库研究” ...

Eclipse内存溢出问题

我们经常遇到eclipse内存溢出问题,实际上只需要修改eclipse程序目录下的eclipse.ini文件, -Xms40m -Xmx1000m -XX:MaxPermSize=256m

Qt入门(20)——Qt模块简介

当你安装Qt时,这些模块会被构建到库中.在Qt企业版.Qt评估版和Qt自由版中,包含所有的模块.对于Qt专业版,提供基本的模块--工具.核心.窗口部件.对话框.图标视图和工作区模块.画布模块画布模块提 ...

SSIS从理论到实战&comma;再到应用&lpar;4&rpar;----流程控制之For循环

原文:SSIS从理论到实战,再到应用(4)----流程控制之For循环 上期回顾: SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器 在SSIS体系中,控制流可能经常会遇到 ...

maven创建web工程Spring配置文件找不到问题解决方案

使用maven创建web工程,将Spring配置文件applicationContext.xml放在src/resource下,用eclipse编译时提示class path resource [ap ...

翻译 &vert; 关键CSS和Webpack&colon; 减少阻塞渲染的CSS的自动化解决方案

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值