From 78b21fc95344caa20a314cff6efc6279783fec57 Mon Sep 17 00:00:00 2001 From: zhouyl <583641232@qq.com> Date: Tue, 24 Sep 2024 10:18:27 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20=E9=99=90=E6=B5=81@RateLimiter?= =?UTF-8?q?=EF=BC=8C=E8=A7=92=E8=89=B2=E6=9D=83=E9=99=90=EF=BC=8Cip?= =?UTF-8?q?=E9=BB=91=E5=90=8D=E5=8D=95=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system}/IpFilterController.java | 39 +- .../system/SysExceptionReportController.java | 9 +- .../common/constant/CacheConstants.java | 7 + .../common/utils/redis/RedisUtils.java | 2 +- .../framework/aspectj/RateLimiterAspect.java | 22 + .../src/main/resources/vm/vue/index.vue.vm | 512 ++++++++------- .../src/main/resources/vm/vue/v3/index.vue.vm | 601 ------------------ .../inscloudtech/system}/domain/IpFilter.java | 6 +- .../system}/mapper/IpFilterMapper.java | 5 +- .../runner/SystemApplicationRunner.java | 7 +- .../system}/service/IpFilterService.java | 5 +- .../service/impl/IpFilterServiceImpl.java | 20 +- .../impl/SysRequestLogServiceImpl.java | 1 + 13 files changed, 350 insertions(+), 886 deletions(-) rename {tp-functional/src/main/java/com/inscloudtech/functional/controller => tp-admin/src/main/java/com/inscloudtech/web/controller/system}/IpFilterController.java (72%) delete mode 100644 tp-generator/src/main/resources/vm/vue/v3/index.vue.vm rename {tp-functional/src/main/java/com/inscloudtech/functional => tp-system/src/main/java/com/inscloudtech/system}/domain/IpFilter.java (83%) rename {tp-functional/src/main/java/com/inscloudtech/functional => tp-system/src/main/java/com/inscloudtech/system}/mapper/IpFilterMapper.java (60%) rename {tp-functional/src/main/java/com/inscloudtech/functional => tp-system/src/main/java/com/inscloudtech/system}/service/IpFilterService.java (66%) rename {tp-functional/src/main/java/com/inscloudtech/functional => tp-system/src/main/java/com/inscloudtech/system}/service/impl/IpFilterServiceImpl.java (60%) diff --git a/tp-functional/src/main/java/com/inscloudtech/functional/controller/IpFilterController.java b/tp-admin/src/main/java/com/inscloudtech/web/controller/system/IpFilterController.java similarity index 72% rename from tp-functional/src/main/java/com/inscloudtech/functional/controller/IpFilterController.java rename to tp-admin/src/main/java/com/inscloudtech/web/controller/system/IpFilterController.java index 9255402..4ed78e7 100644 --- a/tp-functional/src/main/java/com/inscloudtech/functional/controller/IpFilterController.java +++ b/tp-admin/src/main/java/com/inscloudtech/web/controller/system/IpFilterController.java @@ -1,11 +1,14 @@ -package com.inscloudtech.functional.controller; +package com.inscloudtech.web.controller.system; import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.inscloudtech.common.annotation.Log; +import com.inscloudtech.common.annotation.RateLimiter; import com.inscloudtech.common.annotation.RepeatSubmit; +import com.inscloudtech.common.constant.CacheConstants; import com.inscloudtech.common.core.controller.BaseController; import com.inscloudtech.common.core.domain.PageQuery; import com.inscloudtech.common.core.domain.R; @@ -13,8 +16,10 @@ import com.inscloudtech.common.core.page.TableDataInfo; import com.inscloudtech.common.core.validate.AddGroup; import com.inscloudtech.common.core.validate.EditGroup; import com.inscloudtech.common.enums.BusinessType; -import com.inscloudtech.functional.domain.IpFilter; -import com.inscloudtech.functional.service.IpFilterService; +import com.inscloudtech.common.enums.LimitType; +import com.inscloudtech.common.utils.redis.RedisUtils; +import com.inscloudtech.system.domain.IpFilter; +import com.inscloudtech.system.service.IpFilterService; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -38,18 +43,44 @@ public class IpFilterController extends BaseController { private final IpFilterService iIpFilterService; + + + + /** + * 更新限流阈值 + */ + @PutMapping("/updateRateLimiter") + public R updateRateLimiter(@Validated(AddGroup.class) @RequestBody IpFilter bo) { + bo.setId(1L); + iIpFilterService.updateById(bo); + iIpFilterService.initRateLimiter(); + return R.ok(); + } + + @GetMapping("/getRateLimiter") + public R getRateLimiter() { + IpFilter byId = iIpFilterService.getById(1L); + IpFilter r = new IpFilter(); + r.setRateLimiterCount(byId.getRateLimiterCount()); + r.setRateLimiterTime(byId.getRateLimiterTime()); + return R.ok(r); + } + /** * 分页查询 * @param * @param * @return */ + @RateLimiter(count = 6, time = 10,limitType = LimitType.IP) @GetMapping("/page") public TableDataInfo getCpuInfoPage(PageQuery pageQuery, IpFilter filter) { Page page = new Page(); page.setSize(pageQuery.getPageSize()); page.setCurrent(pageQuery.getPageNum()); - Page result = iIpFilterService.page(page, Wrappers.query(filter)); + QueryWrapper query = Wrappers.query(filter); + query.ne("id",1L); + Page result = iIpFilterService.page(page, query); TableDataInfo dataInfo = new TableDataInfo(); dataInfo.setTotal(result.getTotal()); dataInfo.setRows(result.getRecords()); diff --git a/tp-admin/src/main/java/com/inscloudtech/web/controller/system/SysExceptionReportController.java b/tp-admin/src/main/java/com/inscloudtech/web/controller/system/SysExceptionReportController.java index 46d180d..9006234 100644 --- a/tp-admin/src/main/java/com/inscloudtech/web/controller/system/SysExceptionReportController.java +++ b/tp-admin/src/main/java/com/inscloudtech/web/controller/system/SysExceptionReportController.java @@ -16,6 +16,7 @@ import com.inscloudtech.system.domain.SysRequestLog; import com.inscloudtech.system.service.SysExceptionReportService; import com.inscloudtech.system.service.SysRequestLogService; import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; /** @@ -25,7 +26,9 @@ import org.springframework.web.bind.annotation.*; * @date 2024-08-28 */ +@Validated @RequiredArgsConstructor +@RestController @RequestMapping("/functional/exceptionReport") public class SysExceptionReportController { @@ -41,7 +44,7 @@ public class SysExceptionReportController { * @param * @return */ - @GetMapping("/page" ) + @GetMapping("/page") public TableDataInfo page(PageQuery pageQuery, SysExceptionReport sysExceptionReport) { Page page = new Page(); page.setSize(pageQuery.getPageSize()); @@ -62,7 +65,7 @@ public class SysExceptionReportController { */ @Log(title = "异常情况报告", businessType = BusinessType.UPDATE) @RepeatSubmit() - @PutMapping + @PutMapping("/updateById") public R updateById(@RequestBody SysExceptionReport report) { return R.ok(iSysExceptionReportService.updateById(report)); } @@ -74,7 +77,7 @@ public class SysExceptionReportController { */ @Log(title = "异常情况报告", businessType = BusinessType.UPDATE) @RepeatSubmit() - @PutMapping + @PutMapping("/updateYz") public R updateYz(@RequestBody SysRequestLog sysRequestLog) { sysRequestLogService.updateYz(sysRequestLog); return R.ok(); diff --git a/tp-common/src/main/java/com/inscloudtech/common/constant/CacheConstants.java b/tp-common/src/main/java/com/inscloudtech/common/constant/CacheConstants.java index 543b1e2..95ded03 100644 --- a/tp-common/src/main/java/com/inscloudtech/common/constant/CacheConstants.java +++ b/tp-common/src/main/java/com/inscloudtech/common/constant/CacheConstants.java @@ -41,4 +41,11 @@ public interface CacheConstants { * 登录账户密码错误次数 redis key */ String PWD_ERR_CNT_KEY = "pwd_err_cnt:"; + + /** + * 限流 + */ + String RATE_LIMITER_TIME = "rateLimiterConfig:"; + + String RATE_LIMITER_COUNT = "rateLimiterCount:"; } diff --git a/tp-common/src/main/java/com/inscloudtech/common/utils/redis/RedisUtils.java b/tp-common/src/main/java/com/inscloudtech/common/utils/redis/RedisUtils.java index 4872b5e..e474295 100644 --- a/tp-common/src/main/java/com/inscloudtech/common/utils/redis/RedisUtils.java +++ b/tp-common/src/main/java/com/inscloudtech/common/utils/redis/RedisUtils.java @@ -38,7 +38,7 @@ public class RedisUtils { public static long rateLimiter(String key, RateType rateType, int rate, int rateInterval) { RRateLimiter rateLimiter = CLIENT.getRateLimiter(key); rateLimiter.trySetRate(rateType, rate, rateInterval, RateIntervalUnit.SECONDS); - if (rateLimiter.tryAcquire()) { + if (rateLimiter.tryAcquire(1)) { return rateLimiter.availablePermits(); } else { return -1L; diff --git a/tp-framework/src/main/java/com/inscloudtech/framework/aspectj/RateLimiterAspect.java b/tp-framework/src/main/java/com/inscloudtech/framework/aspectj/RateLimiterAspect.java index 1f3d7f4..627b543 100644 --- a/tp-framework/src/main/java/com/inscloudtech/framework/aspectj/RateLimiterAspect.java +++ b/tp-framework/src/main/java/com/inscloudtech/framework/aspectj/RateLimiterAspect.java @@ -57,14 +57,36 @@ public class RateLimiterAspect { @Before("@annotation(rateLimiter)") public void doBefore(JoinPoint point, RateLimiter rateLimiter) throws Throwable { + + Object timeObj = RedisUtils.getCacheObject(CacheConstants.RATE_LIMITER_TIME); + + Object countObj = RedisUtils.getCacheObject(CacheConstants.RATE_LIMITER_COUNT); + int time = rateLimiter.time(); int count = rateLimiter.count(); + if(timeObj != null){ + time = (Integer)timeObj; + } + + if(countObj != null){ + count = (Integer)countObj; + } + String combineKey = getCombineKey(rateLimiter, point); try { RateType rateType = RateType.OVERALL; if (rateLimiter.limitType() == LimitType.CLUSTER) { rateType = RateType.PER_CLIENT; } + /** + * 限流 + * + * @param key 限流key + * @param rateType 限流类型 + * @param rate 速率 + * @param rateInterval 速率间隔 + * @return -1 表示失败 + */ long number = RedisUtils.rateLimiter(combineKey, rateType, count, time); if (number == -1) { String message = rateLimiter.message(); diff --git a/tp-generator/src/main/resources/vm/vue/index.vue.vm b/tp-generator/src/main/resources/vm/vue/index.vue.vm index 7e41538..7053940 100644 --- a/tp-generator/src/main/resources/vm/vue/index.vue.vm +++ b/tp-generator/src/main/resources/vm/vue/index.vue.vm @@ -1,6 +1,6 @@