目录
关键词
限流、令牌桶算法、钉钉微应用
应用场景
钉钉微应用开发时,需要同步钉钉组织架构到业务系统的权限库,由于钉钉的人员同步机制制约,一次只能同步一个人的信息,钉钉对接口调用的频率要求不可超过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