yumeng 22 hours ago
parent
commit
9a2a1c59cf

+ 10 - 0
jeecg-boot-base/jeecg-boot-base-tools/pom.xml

@@ -22,6 +22,16 @@
             <artifactId>spring-boot-starter-data-redis</artifactId>
         </dependency>
         <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson</artifactId>
+            <version>3.36.0</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-pool2</artifactId>
         </dependency>

+ 21 - 3
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/service/impl/BytedanceProjectServiceImpl.java

@@ -5,6 +5,7 @@ import cn.com.ctop.common.module.service.IBytedanceProjectService;
 import cn.com.ctop.common.module.utils.Check;
 import cn.com.ctop.common.module.utils.CorpWexinUtils;
 import cn.com.ctop.common.module.utils.HttpUtils;
+import cn.com.ctop.common.module.utils.RateLimitUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import lombok.extern.slf4j.Slf4j;
@@ -31,6 +32,9 @@ public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
     @Resource
     BytedanceProjectMapper projectListMapper;
 
+    @Autowired
+    private RateLimitUtil rateLimitUtil;
+
 
     @Autowired
     private RedisUtil redisUtil;
@@ -49,7 +53,11 @@ public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
         JSONObject filtering = new JSONObject();
         filtering.put("ids", ids);
         param.put("filtering", filtering);
-        JSONObject resultObject = HttpUtils.bytedanceGetRequest(token, url, param);
+
+        JSONObject resultObject = new JSONObject();
+        if (rateLimitUtil.acquire("1635316529903624", url)) {
+            resultObject = HttpUtils.bytedanceGetRequest(token, url, param);
+        }
         if (Check.isNull(resultObject)) {
             log.error("获取广告列表异常==》accountId:{},调用结果为null", accountId);
             return;
@@ -315,7 +323,12 @@ public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
                 filtering.put("ids", new ArrayList<>(ids));
             }
             param.put("filtering", filtering);
-            JSONObject resultObject = HttpUtils.bytedanceGetRequest(accessToken, url, param);
+
+            JSONObject resultObject = new JSONObject();
+            if (rateLimitUtil.acquire("1635316529903624", url)) {
+                resultObject = HttpUtils.bytedanceGetRequest(accessToken, url, param);
+            }
+
             if (Check.isNull(resultObject)) {
                 log.error("checkAdvertiserProject异常==》accountId:{},结果为null", accountId);
                 return returnMap;
@@ -375,7 +388,12 @@ public class BytedanceProjectServiceImpl implements IBytedanceProjectService {
         list.add(data);
         params.put("data", list);
         String url = bytedanceApiUrl + "/v3.0/project/status/update/";
-        JSONObject object = HttpUtils.bytedancePostRequest(token, url, params);
+
+        JSONObject object = new JSONObject();
+        if (rateLimitUtil.acquire("1635316529903624", url)) {
+            object = HttpUtils.bytedancePostRequest(token, url, params);
+        }
+
         if (!Check.isNull(object)) {
             Integer code = object.getInteger("code");
             if (code == 0) {

+ 63 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/RateLimitUtil.java

@@ -0,0 +1,63 @@
+package cn.com.ctop.common.module.utils;
+
+import com.google.common.collect.ImmutableMap;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RRateLimiter;
+import org.redisson.api.RateIntervalUnit;
+import org.redisson.api.RateType;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@Component
+@RequiredArgsConstructor
+public class RateLimitUtil {
+    @Autowired
+    public RedissonClient redissonClient;
+    private static final Map<String, Boolean> initMap = new ConcurrentHashMap<>();
+    private static final Map<String, Integer> pathQpsMap = new ImmutableMap.Builder<String, Integer>()
+            .put("/open_api/v3.0/report/custom/get/", 21)
+            .put("/open_api/2/file/video/get/", 10)
+            .put("/open_api/v3.0/promotion/list/", 27)
+            .put("/open_api/v3.0/project/list/", 10)
+            .put("/open_api/2/customer_center/advertiser/list/", 50)
+            .put("/open_api/v3.0/tools/micro_app/list/", 10)
+            .put("/open_api/v3.0/tools/asset_link/list/", 10)
+            .put("/open_api/v3.0/tools/wechat_applet/list/", 10)
+            .put("/open_api/2/advertiser/fund/daily_stat/", 50)
+            .put("/open_api/2/advertiser/avatar/get/", 10)
+            .put("/open_api/2/agent/advertiser_info/query/", 10)
+            .put("/open_api/2/tools/site/get/", 10)
+            .put("/open_api/2/report/advertiser/get/", 27)
+            .put("/open_api/v3.0/project/status/update/", 30)
+            .build();
+
+
+
+
+    public boolean acquire(String devAppId, String url) {
+        URI uri = URI.create(url);
+        String path = uri.getPath();
+        String limitKey = path.replaceAll("/$", "").replace("/", ":");
+        String key = "rate:limit" + limitKey + (Check.isNull(devAppId) ? "" : ":" + devAppId);
+        if (!initMap.containsKey(key)) {
+            Integer qps = pathQpsMap.getOrDefault(path, 10);
+            RRateLimiter limiter = redissonClient.getRateLimiter(key);
+            limiter.setRate(
+                    RateType.OVERALL,
+                    qps / 2,
+                    500,
+                    RateIntervalUnit.MILLISECONDS
+            );
+            initMap.put(key, true);
+        }
+        return redissonClient.getRateLimiter(key).tryAcquire(1, 1, TimeUnit.SECONDS);
+    }
+}

+ 70 - 0
jeecg-boot-module-system/src/main/java/cn/com/ctop/common/module/utils/RedisConfig2.java

@@ -0,0 +1,70 @@
+package cn.com.ctop.common.module.utils;
+
+import org.redisson.Redisson;
+import org.redisson.api.RedissonClient;
+import org.redisson.config.Config;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig2 {
+    @Value("${spring.redis.host}")
+    private String host;
+
+    @Value("${spring.redis.port}")
+    private int port;
+
+    @Value("${spring.redis.database}")
+    private int database;
+
+    @Value("${spring.redis.password}")
+    private String password;
+
+    @Bean
+    public RedissonClient redissonClient() {
+        Config config = new Config();
+        config.useSingleServer().setAddress("redis://" + host + ":" + port).setDatabase(database).setPassword(password);
+        return Redisson.create(config);
+    }
+
+    @Bean(name = "redisTemplateDefault")
+    public RedisTemplate<String, Object> redisTemplateDefault() {
+        return createTemplate(database);
+    }
+
+    @Bean(name = "redisTemplate_db10")
+    public RedisTemplate<String, Object> redisTemplate10() {
+        return createTemplate(10);
+    }
+
+    @Bean(name = "redisTemplate_db2")
+    public RedisTemplate<String, Object> redisTemplate2() {
+        return createTemplate(2);
+    }
+
+    private RedisTemplate<String, Object> createTemplate(int dbIndex) {
+        RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
+        config.setHostName(host);
+        config.setPort(port);
+        config.setDatabase(dbIndex);
+        config.setPassword(password);
+
+        LettuceConnectionFactory factory = new LettuceConnectionFactory(config);
+        factory.afterPropertiesSet();
+
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        template.setKeySerializer(new StringRedisSerializer());
+        template.setValueSerializer(new StringRedisSerializer());
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+        template.setConnectionFactory(factory);
+        template.afterPropertiesSet();
+        return template;
+    }
+}