springboot接⼝限流API限流基于注解实现限流基于注解实现接⼝限流
⼀、代码实现
1.引⼊依赖
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--⾕歌限流jar -->
<dependency>
<groupId&le.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2.⾃定义注解 CurrentLimitingAnnotation
/**
* ⾃定义限流注解
* @author sean
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentLimitingAnnotation {
/**
* 限流名称
* @return
*/
String name()default"";
/**
* 每秒限制访问次数
* @return
*/
double token()default5;
}
3.接⼝测试
* @Author : sean
* @DateTime : 2021/7/28、21:30
* @Description :
**/
@RestController
public class AopController {
/
**
* CurrentLimitingAnnotation token默认是5秒,这⾥设置1秒 * @return
*/
@GetMapping("/add")
@CurrentLimitingAnnotation(name ="add", token =1) public String add(){
System.out.println("");
return"success";
}
}
4.AOP 拦截注解实现限流
* @Author : sean
springboot aop* @DateTime : 2021/7/28、21:35
* @Description : 全局拦截限流注解
**/
@Aspect
@Component
public class CurrentLimitingAop {
private ConcurrentHashMap<String, RateLimiter> rateLimiterConcurrentHashMap =new ConcurrentHashMap<>();
@Around(value ="@annotation(com.sean.satoken.annotations.CurrentLimitingAnnotation)")
public Object around(ProceedingJoinPoint joinPoint){
try{
// 获取拦截的⽅法名
MethodSignature methodSignature =(MethodSignature) Signature();
// 获取该⽅法的注解 CurrentLimitingAnnotation
CurrentLimitingAnnotation currentLimitingAnnotation =
//获取到注解的name,token
String name = currentLimitingAnnotation.name();
double token = ken();
//判断改名称是否有创建rateLimiter 没有则创建,有则拿来⽤
RateLimiter rateLimiter = (name);
if(rateLimiter ==null){
rateLimiterConcurrentHashMap.put(name, ate(token));
}
if(!Acquire()){
return"请求过于频繁,请稍后再试";
}
return joinPoint.proceed();
}catch(Throwable throwable){
return"系统错误!";
}
}
}
5.启动类
@SpringBootApplication
public class App {
public static void main(String[] args){
SpringApplication.run(App.class, args);
}
}
6.测试
访问接⼝ ip:port/add,当前接⼝token设置了1秒,如果⼀秒内多次访问 return ”请求过于频繁,请稍后再试“
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论