`
hbxflihua
  • 浏览: 676679 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

通过计数器实现接口限流

    博客分类:
  • java
阅读更多

如果接口可能会有突发访问情况,但又担心访问量大而导致系统崩溃,这个时候就需要对接口的请求并发数进行限制了。可以为相应的接口设置对应的阈值,超过则拒绝请求或者排队等待。

 

1、使用java自带的concurrent包下的类进行限流,示例代码如下:

	private static final AtomicLong atomic = new AtomicLong(0);
	
	public static void limitByAtomic(String hello)throws Exception{		
		try{
			if(atomic.incrementAndGet() > 2){
				//拒绝请求
			}			
			//处理请求			
		}finally{
			atomic.decrementAndGet();
		}	
	}

 

2、使用guava的Cache来限流,示例代码如下:

	public static void limitByCounter(String hello)throws Exception{
		LoadingCache<Long, AtomicLong> counter = 
				CacheBuilder.newBuilder()
				.expireAfterWrite(2, TimeUnit.SECONDS)
				.build(new CacheLoader<Long, AtomicLong>(){
					@Override
					public AtomicLong load(Long seconds) throws Exception {
						return new AtomicLong(0);
					}					
				});
		
		long limit = 1000;

		while(true){
			long currentSeconds = System.currentTimeMillis() / 1000;
			if(counter.get(currentSeconds).incrementAndGet() > limit){
				//拒绝请求
				continue;
			}
			//处理业务
		}				
	}

 

以下是Guava的Cache实现的一个简易版超限计数器

import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;

/**
 * guava计数器工具类
 * 
 * @author lh
 * @version 2.0
 * @since 2017-06-22
 *
 */
public class GuavaCounterUtil {

	private static final Logger LOGGER = LoggerFactory.getLogger(GuavaCounterUtil.class);

	private static final LoadingCache<String, AtomicLong> counter = CacheBuilder.newBuilder()
			.expireAfterWrite(2, TimeUnit.SECONDS)// 每两秒清除一次
			.build(new CacheLoader<String, AtomicLong>() {
				@Override
				public AtomicLong load(String seconds) throws Exception {
					return new AtomicLong(0);
				}
			});

	/**
	 * 请求是否超限
	 * 
	 * @param uri
	 *            请求地址(接口地址或其他可标识字符)
	 * @param limit
	 *            每秒请求限制数
	 * @return
	 */
	public static final boolean overLimit(String uri, long limit) {

		long currentSeconds = System.currentTimeMillis() / 1000;
		try {
			return counter.get(uri + currentSeconds).incrementAndGet() > limit;
		} catch (ExecutionException e) {
			LOGGER.warn(e.getMessage(), e);
		}
		return false;
	}

}

 

分享到:
评论

相关推荐

    基于redis限流系统

    此外,为了提高限流系统的可扩展性和灵活性,可以考虑引入分布式限流方案,例如使用Redis集群,通过分布式锁或分布式计数器来协调不同节点间的限流策略。还可以结合服务发现机制动态调整限流策略,根据服务实例的...

    网关 gateway 动态路由 及 redis 集成限流

    本文将深入探讨"网关 gateway 动态路由 及 redis 集成限流"这一主题,结合Spring Gateway和Redis的集成,详细阐述其原理和实现方法。 首先,动态路由是微服务架构中的一个关键特性,允许系统根据某些条件(如服务...

    55丨算法实战(四):剖析微服务接口鉴权限流背后的数据结构和算法1

    总的来说,微服务接口的鉴权和限流涉及多种数据结构(如散列表、Trie树、队列、计数器)和算法(如字符串匹配、二分查找、Token Bucket、滑动窗口),通过巧妙的设计和优化,可以有效地保障微服务的安全性和稳定性。

    91丨项目实战一:设计实现一个支持各种算法的限流框架(设计)1

    我们只需要选定一个起始时间起点,之后每来一个接口请求,我们都给计数器加一,如果在当前时间窗口内,根据限流规则累加访问次数超过限流值,就触发限流熔断,拒绝接口请求。 然而,固定时间窗口限流算法的缺点也很...

    Sentinel实现限流

    你可以设置不同的限流策略,例如固定窗口限流、滑动窗口限流等,这些策略基于不同的算法实现,如计数器算法、令牌桶算法和漏桶算法。这些算法可以帮助Sentinel在达到设定阈值时,以平滑的方式限制或拒绝新的请求。 ...

    Go+Redis实现的并发安全限流器

    4. **Go限流器的设计模式**:在Go中,可以使用工厂函数或者接口来抽象限流器,提供不同的限流策略(如计数器和滑动窗口)。这使得限流器的实现可扩展且易于测试。此外,通过依赖注入,我们可以方便地替换不同类型的...

    分布式环境下限流方案的实现redis RateLimiter Guava,Token Bucket, Leaky Bucket1

    3. **Redis限流**:通过Redis存储计时器和计数器,每次请求时更新计数,超时或超出阈值则拒绝服务。这种方式适用于分布式环境,因为Redis的数据是全局共享的,可以确保所有节点的限流协同工作,代码实现简洁高效。 ...

    SpringBoot 接口访问频率限制(二)

    通过配置`spring.cloud.gateway.global-ratelimit`或在特定路由上使用`@EnableRateLimiter`注解,可以设置限流规则。 2. **Spring Boot + Spring Security**: 使用Spring Security,我们可以创建一个自定义的...

    go语言五——http模块实现个状态计数器

    此外,Go的HTTP模块还支持中间件模式,你可以创建自定义的中间件来记录请求状态、统计访问频率、限流等功能。通过`HandlerFunc`的链式调用,可以方便地组合多个处理函数,实现复杂的服务逻辑。 总之,Go语言的HTTP...

    Redis实现高并发计数器

    在IT行业中,高并发计数器是一个常见的需求,特别是在服务限流、防止恶意攻击或资源保护的场景下。本文将详细探讨如何利用Redis这一高效、轻量级的内存数据存储系统来实现高并发计数器。 Redis是一个开源的、基于...

    Redis和Lua实现分布式限流器的方法详解

    在实际应用中,根据系统的具体需求和预期的流量模式,可以选择计数器模式或令牌桶模式,或者结合两者,以实现最佳的限流策略。同时,利用 Redis 的持久化特性,可以确保限流器在重启后仍能继续工作,保持限流状态的...

    Sentinel限流、熔断降级源码剖析1

    本文主要探讨Sentinel限流、熔断降级的两种核心算法:计数器法和滑动时间窗口算法。 首先,我们来看计数器法。计数器法是最基础的限流策略,适用于简单的场景。例如,若要限制A接口1分钟内的访问次数不超过100次,...

    spring-boot-starter-flowlimitation:接口限流

    接口限流 前言 服务在大流量下很容易被击垮,现在微服务有限流、熔断模块可以保证服务在大流量下稳定工作;而传统的服务该如何限流呢? 这里抛开NGINX不说,仅从代码层面去实现。 思路 通过filter做限流,因为所有的...

    详解Spring Cloud Gateway 限流操作

    它提供了基于Redis的实现,可以通过KeyResolver来指定限流的Key,例如根据用户、IP、接口等方式进行限流。下面是 Spring Cloud Gateway 限流操作的详细介绍: 限流算法 在限流操作中, Spring Cloud Gateway 提供...

    python分布式环境下的限流器的示例

    2. **单进程多线程场景**:对于单进程多线程的应用场景,可以通过使用线程安全的`Queue`作为全局变量来实现简单的限流功能。 - 使用一个后台线程定时清空队列,以确保队列大小不会无限增长。 - 每次请求到达时,向...

    PHP计数器的实现代码

    首先,我们来看一下基于文本文件的计数器实现。这段代码通过读取和更新一个名为"mycounter.txt"的文本文件来计数: ```php /* 使用文本文件记录数据的简单实现 */ $counter = 1; if (file_exists("mycounter.txt")...

    AspNetCoreRateLimit-master_限制流量访问_

    此外,`IRateLimitCounterStore`接口用于存储这些计数器,你可以选择内存存储或数据库存储,这取决于你的应用场景。 在配置`AspNetCoreRateLimit`时,你需要定义速率限制策略。这些策略包括两个主要部分:窗口时间...

    FPGA实现串行接口 RS232

    FPGA实现串行接口RS232是一种常见的通信方式,特别是在需要硬件级定制通信协议时。RS-232是一种标准的串行通信接口,它...通过FPGA实现的RS-232接口,开发者可以更深入地控制通信过程,实现高速、低延迟的数据交换。

    高性能的 PHP API 接口开发 第2章 API接口的基本实现.rar

    PHP可以通过计数器、令牌桶算法等实现限流。同时,了解如何使用防火墙规则和验证码来增强API安全性。 10. **监控与日志**: 实时监控API的性能和错误,以及记录详细的日志,有助于及时发现问题并进行优化。PHP可以...

    Sentinel底层原理分析.pdf

    Sentinel 通过独立的统计节点来实现,并且可以将统计信息存储在外部存储,比如Redis,这样可以实现不同应用之间共享限流资源,提高了限流策略的灵活性和准确性。 总之,Sentinel作为一款优秀的分布式系统的流量控制...

Global site tag (gtag.js) - Google Analytics