用guava实现API接口限流

本文介绍了如何使用Guava的令牌桶算法实现API接口限流,适用于如钉钉微应用等需要控制接口调用频率的场景。详细讲解了原理,并通过代码示例展示具体实现过程。
摘要由CSDN通过智能技术生成

目录

关键词

应用场景

原理简介

具体代码实现细节

特别说明


关键词

限流、令牌桶算法、钉钉微应用

应用场景

钉钉微应用开发时,需要同步钉钉组织架构到业务系统的权限库,由于钉钉的人员同步机制制约,一次只能同步一个人的信息,钉钉对接口调用的频率要求不可超过1500次/分,所以考虑对同步的接口频率做简答的接口限流。

原理简介

令牌桶算法是网络流量整型和速率限制中最常使用的一种算法。在网络传输中,为了防止网络拥塞,需限制流流出网络的流量,使流量以比较均匀的速度向外发送。令牌桶算法就实现了这个功能,可控制发送到网络上数据的数目,并允许突发数据的发送。百度百科如是说。

guava限流有两种算法,漏桶算法和令牌桶算法,今天我们只说基于令牌桶算法的限流实现。令牌桶算法简单来说,系统产生一个桶,并会以一个恒定的速度向里放令牌,如果请求需要被处理,首先需要从令牌桶获取一个令牌,桶里没有令牌时,则拒绝服务。

具体代码实现细节

  • 首先,maven加人google的guava包的依赖:
        <!-- guava-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>23.0</version>
        </dependency>
  • 定义一个注解,标记需要限流的接口方法:
import com.google.common.util.concurrent.RateLimiter;
import com.demo.device.common.exception.customize.BizExecption;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Aspect
@Slf4j
@Component
public class RateLimiterAop {
    /**
     * 根据请求地址保存不同的令牌桶
     */
    private static final Map<String, RateLimiter> rateLimiterMap = new ConcurrentHashMap<String,RateLimiter>();

    /**
     * 切入去点拦截加有  ReqeustRateLimiter 注解的控制器
     */
    @Poi
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值