guava 对接口限流处理
2023-12-13 04:24:15
- 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
- 自定义注解
/**
* 限流器注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Limiter {
int count() default 20;
int time() default 1;
}
- 定义切面
@Aspect
@Component
public class RateLimiterAspect {
private static final Logger LOGGER = LoggerFactory.getLogger(RateLimiterAspect.class);
private ConcurrentHashMap<String, RateLimiter> RATE_LIMITER = new ConcurrentHashMap<>();
@Before(value = "@annotation(com.shi.demo.annotation.Limiter)")
public void handleRateLimiter(JoinPoint jp) {
RateLimiter rateLimiter = null;
MethodSignature signature = (MethodSignature) jp.getSignature();
Method method = signature.getMethod();
Limiter annotation = method.getAnnotation(Limiter.class);
int count = annotation.count();
int time = annotation.time();
String className = method.getDeclaringClass().getName();
String methodName = method.getName();
String key = className + "." + methodName;
if (!RATE_LIMITER.containsKey(key)) {
rateLimiter = RateLimiter.create(count, time, TimeUnit.SECONDS);
RATE_LIMITER.put(key, rateLimiter);
}
rateLimiter = RATE_LIMITER.get(key);
if (!rateLimiter.tryAcquire()) {
throw new RuntimeException("限流了,请稍后再试");
}
}
}
- 接口上 使用注解
@RestController
@RequestMapping("/users")
public class UserController {
@Limiter
@GetMapping
public String get(){
return "get";
}
@Limiter(count=20,time=1)
@PostMapping
public String post(){
return "post";
}
@DeleteMapping
public String delete(){
return "delete";
}
}
文章来源:https://blog.csdn.net/qq_58706693/article/details/134813132
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!