欢迎光临散文网 会员登陆 & 注册

【Java项目】自定义注解 + AOP + Guava Limiter(优雅实现

2023-06-15 19:14 作者:美丽的程序人生  | 我要投稿

【Java项目】自定义注解 + AOP + Guava Limiter(优雅实现接口限流)

1、概述

在互联网项目开发过程中,对于某些高频或者在高并发环境下使用的接口,可能会在某一时候遇到突发很高的流量,瞬时被大量调用。为保证应用服务稳定运行,需要对高并发场景下接口进行限流处理,通过接口限流一定程度上也可以防止接口被恶意调用。这里主要介绍下采用自定义注解、切面编程、Guava的Limiter实现接口限流。

2、自定义注解

Java自定义注解是一种非常强大的语法结构,允许开发者自定义注解,自定义注解可以为程序添加元数据信息、代码分析、运行时处理、框架集成提供非常大的便利。

2.1 使用场景介绍
  • 标记:可以用注解来标记代码,便于开发人员或者工具根据注解执行某些操作或者特殊处理;
  • 配置:用于配置类、方法、属性的等参数和属性值,使开发人员可以通过注解指定配置信息;
  • 检查:可以通过注解来检查代码正确性、合法性,便于及时发现代码错误;
  • 文档:用于生成代码文档、API文档等,例如Swagger相关注解。
2.2 语法结构
 @Target(ElementType.METHOD)
 @Retention(RetentionPolicy.RUNTIME)
 public @interface Limiter {
   // 默认每秒放入桶中的令牌数
   double limitNum() default 5;
   // 限流器名称,使用该注解的每一个方法上,保证全局唯一性
   String name() default "";
 }
2.3 使用说明
  • 自定义注解一般会与Spring AOP配合使用,通过定义将注解定义为切入点,获取到使用了这个注解的方法或者类,然后根据注解信息做一些处理;
  • 有时候也会与RequestBodyAdvice 、部分拦截器一起使用,通过获取对应方法中包含该注解进行处理;
  • 主要还是使用反射技术,获取到包含注解的类、方法或字段,然后进行对应业务处理。

AOP

面向切面编程,不修改源代码给程序动态统一添加额外功能的一种技术,实现业务代码解耦,应用主要体现在事务处理、日志管理、权限控制、异常处理等方面,分离功能性需求和非功能性需求,增强代码的可读性和可维护性。



日志记录
事务管理
权限验证
性能监控
@Aspect 注解

作用是把当前类标识为一个切面供容器读取。

@Before

在方法执行前执行该方法,并且可以通过(JoinPoint类)获取请求参数和方法。

@After

后置通知,在方法执行后执行。可以通过(JoinPoint类)获取请求参数和方法。

@Around

环绕增强,传入ProceedingJoinPoint,调用point.proceed()目标方法,相当于MethodInterceptor

@Pointcut

标注在方法上面,用来定义切入点,格式:@ 注解(value=“表达标签 (表达式格式)”) 如:

 @Pointcut("execution(* com.javacode2018.aop.demo9.test1.Service1.*(..))")
  • execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?

name-pattern(param-pattern) throws-pattern?);

  • @annotation用于匹配方法上拥有指定注解的情况。

Guava Limiter限流器

令牌桶算法介绍
  • 令牌桶算法则是一个存放固定容量令牌的桶,按照固定速率往桶里添加令牌;
  • 桶中存放的令牌数有最大上限,超出之后就被丢弃或者拒绝;
  • 当流量或者网络请求到达时,每个请求都要获取一个令牌,如果能够获取到,则直接处理,并且令牌桶删除一个令牌;
  • 如果获取不到,该请求就要被限流,要么直接丢弃,要么在缓冲区等待。
Limiter API介绍
 // 创建令牌桶,设置生成令牌速度
 RateLimiter.create(5);
 // 获取令牌,如果还没有到达接受下一个请求的时间点,就继续等待
 acquire()
 //获取令牌,如果在我允许的时间范围内获取不到就不等了,如果能获取到那我就等着。
 tryAcquire()

总结

1、通过自定义注解实现接口限流配置和标记;

2、通过Spring AOP 切面编程实现限流逻辑,与业务代码解耦;

3、通过Guava Limiter优雅限流。

【Java项目】自定义注解 + AOP + Guava Limiter(优雅实现的评论 (共 条)

分享到微博请遵守国家法律