以下是使用注解实现接口限流的完整代码方案,使用了Guava RateLimiter来实现限流操作。

Maven依赖:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>28.2-jre</version>
</dependency>

自定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RateLimit {
    double permitsPerSecond();
}

限流切面:

@Aspect
@Component
public class RateLimitAspect {

    private final Map<String, RateLimiter> limiters = new ConcurrentHashMap<>();

    @Around("@annotation(rateLimit)")
    public Object rateLimit(ProceedingJoinPoint joinPoint, RateLimit rateLimit) throws Throwable {
        String methodName = joinPoint.getSignature().getName();
        RateLimiter limiter = limiters.computeIfAbsent(methodName, k -> RateLimiter.create(rateLimit.permitsPerSecond()));
        if (limiter.tryAcquire()) {
            return joinPoint.proceed();
        } else {
            return '接口限流,请稍后再试!';
        }
    }
}

测试类:

@RestController
public class DemoController {

    @RateLimit(permitsPerSecond = 0.5)
    @GetMapping('/test')
    public String test() {
        return 'success';
    }
}

使用时,只需要在需要限流的接口上添加@RateLimit注解即可,其中permitsPerSecond表示每秒允许的请求数。

当触发限流条件时,返回的是字符串'接口限流,请稍后再试!',可以根据实际情况进行调整。

Java注解实现接口限流完整代码方案 - 使用Guava RateLimiter

原文地址: https://www.cveoy.top/t/topic/lU66 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录