wangrong
2026-08-30 4c949c0dc9bcae785c281c9d8125295f09810b15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package io.dataease.traffic;
 
import io.dataease.exception.DEException;
import io.dataease.traffic.dao.entity.CoreApiTraffic;
import io.dataease.traffic.dao.mapper.CoreApiTrafficMapper;
import io.dataease.utils.IDUtils;
import io.dataease.utils.LogUtil;
import jakarta.annotation.Resource;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
import java.lang.reflect.Method;
 
@Aspect
@Component
public class DeTrafficAop {
 
    @Resource
    private CoreApiTrafficMapper coreApiTrafficMapper;
 
    @Value("${dataease.traffic:2}")
    private Integer defaultTraffic;
 
    final private static String errorMsg = "当前API【%s】设定并发阈值为【%s】,现已经达到限流阈值,请稍后再试!";
 
    @Around(value = "@annotation(io.dataease.traffic.DeTraffic)")
    public Object trafficAround(ProceedingJoinPoint point) throws Throwable {
        MethodSignature ms = (MethodSignature) point.getSignature();
        Method method = ms.getMethod();
        DeTraffic traffic = method.getAnnotation(DeTraffic.class);
 
        int value = traffic.value();
        if (value == 0) {
            value = defaultTraffic;
        }
        String api = traffic.api();
        Object result = null;
        boolean access = false;
        try {
            Integer count = coreApiTrafficMapper.apiCount(api);
            if (count == 0) {
                CoreApiTraffic apiTraffic = new CoreApiTraffic();
                apiTraffic.setId(IDUtils.snowID());
                apiTraffic.setAlive(1);
                apiTraffic.setThreshold(value);
                apiTraffic.setApi(api);
                coreApiTrafficMapper.insert(apiTraffic);
                access = true;
                result = point.proceed();
                return result;
            }
            int alive = coreApiTrafficMapper.getAlive(api);
            if (alive < value) {
                coreApiTrafficMapper.upgrade(api);
                access = true;
                result = point.proceed();
                return result;
            }
        } catch (Exception e) {
            LogUtil.error(e.getMessage(), e);
        } finally {
            if (access) {
                coreApiTrafficMapper.releaseAlive(api);
            }
        }
        DEException.throwException(String.format(errorMsg, api, value));
        return null;
    }
}