diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/RemoteWarningCRUDFeign.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/RemoteWarningCRUDFeign.java index b6d3184e..fa9e08c0 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/RemoteWarningCRUDFeign.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/RemoteWarningCRUDFeign.java @@ -5,10 +5,14 @@ import com.ruoyi.common.core.domain.R; import com.xjs.business.warning.domain.ApiRecord; import com.xjs.business.warning.factory.RemoteWarningCRUDFactory; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.cloud.openfeign.SpringQueryMap; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; +import java.util.List; + /** * @author xiejs * @desc 远程rpc调用预警服务crud接口 @@ -19,12 +23,17 @@ import org.springframework.web.bind.annotation.RequestBody; fallbackFactory = RemoteWarningCRUDFactory.class) public interface RemoteWarningCRUDFeign { - @PostMapping + @PostMapping("apiwarning") public R saveApiRecord(@RequestBody ApiRecord apiRecord); - @PutMapping + @PutMapping("apiwarning") public R updateApiRecord(@RequestBody ApiRecord apiRecord); + @GetMapping("apiwarning") + R> selectApiRecordList(@SpringQueryMap ApiRecord apiRecord) ; + + + } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/domain/ApiRecord.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/domain/ApiRecord.java index 8c127be9..09cb06e0 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/domain/ApiRecord.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/domain/ApiRecord.java @@ -21,6 +21,11 @@ public class ApiRecord implements Serializable { /** api地址 */ private String apiUrl; + /** + * 请求耗费时间 + */ + private Integer requestTime; + /** api总请求次数 */ private Long totalCount; @@ -86,4 +91,12 @@ public class ApiRecord implements Serializable { public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } + + public Integer getRequestTime() { + return requestTime; + } + + public void setRequestTime(Integer requestTime) { + this.requestTime = requestTime; + } } diff --git a/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/factory/RemoteWarningCRUDFactory.java b/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/factory/RemoteWarningCRUDFactory.java index f9aafdcd..520b70d5 100644 --- a/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/factory/RemoteWarningCRUDFactory.java +++ b/ruoyi-api/ruoyi-api-system/src/main/java/com/xjs/business/warning/factory/RemoteWarningCRUDFactory.java @@ -8,6 +8,8 @@ import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; +import java.util.List; + /** * @author xiejs * @desc 调用预警服务降级处理 @@ -23,13 +25,19 @@ public class RemoteWarningCRUDFactory implements FallbackFactory saveApiRecord(ApiRecord apiRecord) { - log.error("调用预警服务添加接口失败----"+apiRecord.getApiName()); + log.error("调用预警服务添加接口失败,执行降级处理----"+apiRecord.getApiName()); return R.fail(); } @Override public R updateApiRecord(ApiRecord apiRecord) { - log.error("调用预警服务修改接口失败----"+apiRecord.getApiName()); + log.error("调用预警服务修改接口失败,执行降级处理----"+apiRecord.getApiName()); + return R.fail(); + } + + @Override + public R> selectApiRecordList(ApiRecord apiRecord) { + log.error("调用预警服务查询接口失败,执行降级处理----"+apiRecord.getApiName()); return R.fail(); } }; diff --git a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/aop/ApiLogAspect.java b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/aop/ApiLogAspect.java index e8340b4a..f153b9c5 100644 --- a/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/aop/ApiLogAspect.java +++ b/xjs-business/xjs-business-openapi/src/main/java/com/xjs/common/aop/ApiLogAspect.java @@ -1,19 +1,26 @@ package com.xjs.common.aop; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import com.ruoyi.common.core.domain.R; import com.xjs.business.warning.RemoteWarningCRUDFeign; +import com.xjs.business.warning.domain.ApiRecord; import com.xjs.enums.StatusEnum; import com.xjs.log.mapper.ApiLogMapper; import lombok.extern.log4j.Log4j2; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; +import java.util.List; import java.util.Optional; /** @@ -51,17 +58,8 @@ public class ApiLogAspect { LocalDateTime localDateTime2 = DateUtil.date().toLocalDateTime(); long between = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2); log.info("调用接口耗费时间:{}ms", between); - //执行预警切入逻辑 - - - - - - - - - + warning(between, joinPoint); return obj; } catch (Throwable e) { e.printStackTrace(); @@ -71,7 +69,6 @@ public class ApiLogAspect { /** * 处理完请求后执行 - * * @param joinPoint 切点 */ @AfterReturning(pointcut = "@annotation(apiLog)", returning = "jsonResult") @@ -80,6 +77,12 @@ public class ApiLogAspect { } + /** + * 异常切点 + * @param joinPoint 连接点 + * @param apiLog 自定义注解 + * @param e 抛出的异常 + */ @AfterThrowing(value = "@annotation(apiLog)", throwing = "e") public void doAfterThrowing(JoinPoint joinPoint, ApiLog apiLog, Exception e) { handleApiLog(joinPoint, apiLog, e, null); @@ -108,4 +111,51 @@ public class ApiLogAspect { apiLogMapper.insert(entity); } + /** + * 预警切入 + * @param between api接口调用时间 + * @param joinPoint aop连接对象 + */ + private void warning(long between, ProceedingJoinPoint joinPoint) { + //获取目标类名及方法名 + Signature signature = joinPoint.getSignature(); + String method = signature.getName(); + Class aclass = signature.getDeclaringType(); + Method[] methods = aclass.getMethods(); + //根据目标的方法名判断当前方法 + for (Method thisMethod : methods) { + if (method.equals(thisMethod.getName())) { + //拿到当前方法的注解判断是否为apiLog注解 + Annotation[] declaredAnnotations = thisMethod.getDeclaredAnnotations(); + for (Annotation annotation : declaredAnnotations) { + if (annotation instanceof ApiLog) { + String name = ((ApiLog) annotation).name(); + String url = ((ApiLog) annotation).url(); + //根据拿到的url和name查询数据库是否存在,存在则count+1,不存在则add + ApiRecord apiRecord = new ApiRecord(); + apiRecord.setApiName(name); + apiRecord.setApiUrl(url); + apiRecord.setRequestTime((int) between); + R> listR = remoteWarningCRUDFeign.selectApiRecordList(apiRecord); + if (listR.getCode() == R.SUCCESS) { + List data = listR.getData(); + if (CollUtil.isEmpty(data)) { + //设置初始请求次数 + apiRecord.setTotalCount(1L); + remoteWarningCRUDFeign.saveApiRecord(apiRecord); + }else { + ApiRecord haveApiRecord = data.get(0); + haveApiRecord.setRequestTime((int) between); + haveApiRecord.setTotalCount(haveApiRecord.getTotalCount()+1L); + remoteWarningCRUDFeign.updateApiRecord(haveApiRecord); + } + } + } + } + } + } + + + } + } diff --git a/xjs-business/xjs-business-warning/src/main/java/com/xjs/controller/ApiWarningController.java b/xjs-business/xjs-business-warning/src/main/java/com/xjs/controller/ApiWarningController.java index e7dab5ec..3584db85 100644 --- a/xjs-business/xjs-business-warning/src/main/java/com/xjs/controller/ApiWarningController.java +++ b/xjs-business/xjs-business-warning/src/main/java/com/xjs/controller/ApiWarningController.java @@ -7,9 +7,11 @@ import com.xjs.service.ApiWarningService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import java.util.List; + /** * @author xiejs - * @desc api预警控制器 + * @desc api预警控制器 * @create 2021-12-31 */ @RestController @@ -21,6 +23,7 @@ public class ApiWarningController extends BaseController { /** * 保存 apiRecord + * * @param apiRecord api记录 * @return apiRecord */ @@ -29,9 +32,21 @@ public class ApiWarningController extends BaseController { return apiWarningService.saveApiRecord(apiRecord) ? R.ok() : R.fail(); } + /** + * 修改 + * + * @param apiRecord api记录 + * @return ApiRecord + */ @PutMapping public R updateApiRecord(@RequestBody ApiRecord apiRecord) { - return apiWarningService.updateApiRecord(apiRecord)? R.ok() : R.fail(); + return apiWarningService.updateApiRecord(apiRecord) ? R.ok() : R.fail(); + } + + @GetMapping + public R> selectApiRecordList(ApiRecord apiRecord) { + List apiRecords = apiWarningService.selectApiRecordList(apiRecord); + return R.ok(apiRecords); } } diff --git a/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/ApiWarningService.java b/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/ApiWarningService.java index aa01085b..5eb6c880 100644 --- a/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/ApiWarningService.java +++ b/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/ApiWarningService.java @@ -2,6 +2,8 @@ package com.xjs.service; import com.xjs.domain.ApiRecord; +import java.util.List; + /** * @author xiejs * @desc @@ -23,4 +25,11 @@ public interface ApiWarningService { * @return apiRecord */ boolean updateApiRecord(ApiRecord apiRecord); + + /** + * 根据 apiurl和name查询 + * @param apiRecord + * @return + */ + List selectApiRecordList(ApiRecord apiRecord); } diff --git a/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/impl/ApiWarningServiceImpl.java b/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/impl/ApiWarningServiceImpl.java index 412d0fd7..131c5045 100644 --- a/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/impl/ApiWarningServiceImpl.java +++ b/xjs-business/xjs-business-warning/src/main/java/com/xjs/service/impl/ApiWarningServiceImpl.java @@ -8,6 +8,7 @@ import com.xjs.service.ApiWarningService; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.util.List; import java.util.Objects; /** @@ -41,5 +42,12 @@ public class ApiWarningServiceImpl implements ApiWarningService { return name == 1; } + @Override + public List selectApiRecordList(ApiRecord apiRecord) { + return apiRecordMapper + .selectList(new QueryWrapper().eq("api_name",apiRecord.getApiName()) + .eq("api_name",apiRecord.getApiName())); + } + }