java 自定义注解 实现限流

简介: java 自定义注解 实现限流

在Java中,可以使用注解来实现限流。以下是一个简单的示例:


1. 首先,创建一个自定义注解`@RateLimiter`:


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


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

2. 然后,创建一个限流器类`RateLimiterAspect`,并实现限流逻辑:


import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;


import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;


@Aspect
@Component
public class RateLimiterAspect {


    private static final AtomicInteger counter = new AtomicInteger(0);


    @Around("@annotation(rateLimiter)")
    public Object around(ProceedingJoinPoint joinPoint, RateLimiter rateLimiter) throws Throwable {
        double permitsPerSecond = rateLimiter.permitsPerSecond();
        long interval = (long) (1000 / permitsPerSecond);
        long currentTime = System.currentTimeMillis();
        long lastTime = currentTime - interval;


        while (true) {
            int currentCounter = counter.get();
            if (currentCounter > 0 && currentTime - lastTime < interval) {
                Thread.sleep(interval - (currentTime - lastTime));
                currentTime = System.currentTimeMillis();
            } else {
                if (counter.compareAndSet(currentCounter, currentCounter + 1)) {
                    lastTime = currentTime;
                    break;
                }
            }
        }


        return joinPoint.proceed();
    }
}

3. 最后,在需要限流的方法上添加`@RateLimiter`注解:

public class MyService {


    @RateLimiter(permitsPerSecond = 2) // 每秒允许2个请求
    public void myMethod() {
        // 业务逻辑
    }
}

这样,当调用`myMethod`方法时,会根据`@RateLimiter`注解中设置的速率进行限流。

目录
相关文章
|
1月前
|
Java Spring 容器
【Java】Spring如何扫描自定义的注解?
【Java】Spring如何扫描自定义的注解?
35 0
|
1月前
|
Java 数据库连接
hibernate注解实体类(Dept.java)
hibernate注解实体类(Dept.java)
13 1
|
1月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——(Dept.java)
Hibernate中使用Criteria查询及注解——(Dept.java)
14 1
|
29天前
|
存储 SQL Java
【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了(二)
【Java技术指南】「JPA编程专题」让你不再对JPA技术中的“持久化型注解”感到陌生了
44 1
|
1天前
|
Java 关系型数据库 MySQL
万字长文带你详聊Java注解本质
万字长文带你详聊Java注解本质
8 0
|
4天前
|
Java 测试技术 编译器
JAVA注解
JAVA注解
9 0
|
15天前
|
Java
Java配置大揭秘:读取自定义配置文件的绝佳指南
Java配置大揭秘:读取自定义配置文件的绝佳指南
16 0
Java配置大揭秘:读取自定义配置文件的绝佳指南
|
19天前
|
NoSQL Java Redis
Java自定义线程池的使用
Java自定义线程池的使用
|
1月前
|
Java 数据库连接
hibernate注解实体类(Emp.java)
hibernate注解实体类(Emp.java)
14 1
|
1月前
|
Java 数据库连接
Hibernate中使用Criteria查询及注解——(DeptTest.java)
Hibernate中使用Criteria查询及注解——(DeptTest.java)
8 1