Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截
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.redisson.api.RRateLimiter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class RateLimitAspect {
@Autowired
private RedissonClient redissonClient;
@Pointcut("@annotation(rateLimit)")
public void rateLimitPointcut(RateLimit rateLimit) {
}
@Around("rateLimitPointcut(rateLimit)")
public Object aroundAdvice(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {
// 获取限流器
RRateLimiter rateLimiter = redissonClient.getRateLimiter(rateLimit.key());
// 设置等待时间和速率
rateLimiter.trySetRate(rateLimit.rate(), rateLimit.period(), rateLimit.unit());
// 尝试获取许可
if (rateLimiter.tryAcquire(rateLimit.timeout(), rateLimit.unit())) {
// 如果获取到许可,则执行方法
return joinPoint.proceed();
} else {
// 如果未获取到许可,抛出异常或者返回错误信息
throw new RuntimeException("Access limited");
}
}
}
这个示例代码展示了如何使用Redisson的RRateLimiter来实现方法的访问限流。通过AOP(面向切面编程),我们可以在指定的注解下,对方法进行限流控制。这个例子中,如果无法在指定时间内获取到令牌(即访问频率超出限制),则会抛出异常。这种方式可以有效地防止恶意请求或者频繁的请求导致的服务过载问题。
评论已关闭