@RestController
public class GuavaRate {
@ZRateLimiter(rate = 5,timeOut = 100)
@RequestMapping("/find2")
public void tryAcquire(){
}
}
@Target(value = ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZRateLimiter {
double rate();
long timeOut() default 0;
}
@Aspect
@Component
public class RateLimiterAspect {
@Autowired
private HttpServletResponse response;
private RateLimiter rateLimiter=RateLimiter.create(50);
@Pointcut("@annotation(com.aop.demo.GUAVA.ZRateLimiter)")
public void pointcut(){}
@Around("pointcut()")
public Object RateLimiter2(ProceedingJoinPoint joinPoint)throws Throwable{
MethodSignature signature= (MethodSignature)joinPoint.getSignature();
ZRateLimiter zRateLimiter
= signature.getMethod().getDeclaredAnnotation(ZRateLimiter.class);
if(zRateLimiter==null){
return joinPoint.proceed();
}
double rate = zRateLimiter.rate();
long timeOut = zRateLimiter.timeOut();
rateLimiter.setRate(rate);
boolean tryAcquire = rateLimiter.tryAcquire(timeOut, TimeUnit.MILLISECONDS);
if(!tryAcquire){
System.out.println("服务繁忙,请稍后再试");
return "服务繁忙,请稍后再试";
}
System.out.println("success");
return joinPoint.proceed();
}
}
RateLimiter rateLimiter=RateLimiter.create(5);
System.out.println(rateLimiter.acquire(1));
System.out.println(rateLimiter.acquire(1));
System.out.println(rateLimiter.acquire(1));
System.out.println(rateLimiter.acquire(1));
0.0
0.198121
0.192586
0.198563
RateLimiter rateLimiter=RateLimiter.create(5);
System.out.println(rateLimiter.acquire(100));
System.out.println(rateLimiter.acquire(1));
System.out.println(rateLimiter.acquire(1));
System.out.println(rateLimiter.acquire(1));
0.0
19.99783
0.192275
0.197414