说明:1、实现api预警切点切入api接口获取api记录信息,并远程调用预警服务执行cru操作

pull/254/head
xjs 4 years ago
parent a63615cd12
commit 60f76ee94a

@ -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 rpccrud
@ -19,12 +23,17 @@ import org.springframework.web.bind.annotation.RequestBody;
fallbackFactory = RemoteWarningCRUDFactory.class)
public interface RemoteWarningCRUDFeign {
@PostMapping
@PostMapping("apiwarning")
public R<ApiRecord> saveApiRecord(@RequestBody ApiRecord apiRecord);
@PutMapping
@PutMapping("apiwarning")
public R<ApiRecord> updateApiRecord(@RequestBody ApiRecord apiRecord);
@GetMapping("apiwarning")
R<List<ApiRecord>> selectApiRecordList(@SpringQueryMap ApiRecord apiRecord) ;
}

@ -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;
}
}

@ -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<RemoteWarningCR
return new RemoteWarningCRUDFeign() {
@Override
public R<ApiRecord> saveApiRecord(ApiRecord apiRecord) {
log.error("调用预警服务添加接口失败----"+apiRecord.getApiName());
log.error("调用预警服务添加接口失败,执行降级处理----"+apiRecord.getApiName());
return R.fail();
}
@Override
public R<ApiRecord> updateApiRecord(ApiRecord apiRecord) {
log.error("调用预警服务修改接口失败----"+apiRecord.getApiName());
log.error("调用预警服务修改接口失败,执行降级处理----"+apiRecord.getApiName());
return R.fail();
}
@Override
public R<List<ApiRecord>> selectApiRecordList(ApiRecord apiRecord) {
log.error("调用预警服务查询接口失败,执行降级处理----"+apiRecord.getApiName());
return R.fail();
}
};

@ -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<List<ApiRecord>> listR = remoteWarningCRUDFeign.selectApiRecordList(apiRecord);
if (listR.getCode() == R.SUCCESS) {
List<ApiRecord> 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);
}
}
}
}
}
}
}
}

@ -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<ApiRecord> updateApiRecord(@RequestBody ApiRecord apiRecord) {
return apiWarningService.updateApiRecord(apiRecord)? R.ok() : R.fail();
return apiWarningService.updateApiRecord(apiRecord) ? R.ok() : R.fail();
}
@GetMapping
public R<List<ApiRecord>> selectApiRecordList(ApiRecord apiRecord) {
List<ApiRecord> apiRecords = apiWarningService.selectApiRecordList(apiRecord);
return R.ok(apiRecords);
}
}

@ -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);
/**
* apiurlname
* @param apiRecord
* @return
*/
List<ApiRecord> selectApiRecordList(ApiRecord apiRecord);
}

@ -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<ApiRecord> selectApiRecordList(ApiRecord apiRecord) {
return apiRecordMapper
.selectList(new QueryWrapper<ApiRecord>().eq("api_name",apiRecord.getApiName())
.eq("api_name",apiRecord.getApiName()));
}
}

Loading…
Cancel
Save