高并发限流

本文探讨了在高并发环境下实现服务限流的重要性,如秒杀、双11活动、防止流量攻击和避免雪崩效应。文章介绍了三种限流方式:1) 计数器方式,存在临界值问题;2) 滑动窗口计数,解决了临界值问题;3) 令牌桶算法,通过预先填充令牌并按需消耗来限制请求速率。还提到了使用RateLimiter进行令牌桶限流的实现方法,包括基本实现和注解版本的实现。
摘要由CSDN通过智能技术生成

一、为什么要实现服务限流

秒杀抢购、双11、服务安全(流量攻击、DDOS)、雪崩效应 因为流量突然特别大。

二、限流方式

1、计数器方式

        比如某个接口1分钟的请求不能超过10次,那么就可以设置一个计数器,每次请求,计数器加1。先判断上一次执行时间与当前时间是否在1分钟之内,若在1分钟之类则将次数累加一然后return 当前次数<=10。若大于1分钟则重置计数器 return true。传统模式的弊端,在临界值时若出现大量的请求,就不符合每分钟10次的要求。

    private int limtCount = 10;// 限制最大访问的容量
	AtomicInteger atomicInteger = new AtomicInteger(0); // 每秒钟 实际请求的数量
	private long start = System.currentTimeMillis();// 获取当前系统时间
	private int interval = 60;// 间隔时间60秒

	public boolean acquire() {
		long newTime = System.currentTimeMillis();
		if (newTime > (start + interval)) {
			// 判断是否是一个周期
			start = newTime;
			atomicInteger.set(0); // 清理为0
			return true;
		}
		atomicInteger.incrementAndGet();// i++;
		return atomicInteger.get() <= limtCount;
	}

2、滑动窗口计数

        算法原理:在一分钟之类分为6个格子,每个格子都有自己独立的计数器。当所有格式都满了后,会重新创建一个格子,重新开始计数。可以解决传统计数器的临界值问题。

3、令牌桶算法

         算法原理:开启个独立线程以固定速率往桶里添加令牌,在访问接口的时候先从桶里获取令牌,若获取不到令牌,直接拒绝访问服务。

        a、使用 RateLimiter实现令牌桶限流:

//导包
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guav
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值