parent
70c373401e
commit
f53394410b
|
|
@ -0,0 +1,30 @@
|
||||||
|
package com.xjs.business.warning;
|
||||||
|
|
||||||
|
import com.ruoyi.common.core.constant.ServiceNameConstants;
|
||||||
|
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.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PutMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiejs
|
||||||
|
* @desc 远程rpc调用预警服务crud接口
|
||||||
|
* @create 2021-12-31
|
||||||
|
*/
|
||||||
|
@FeignClient(contextId = "remoteWarningCRUDFeign",
|
||||||
|
value = ServiceNameConstants.BUSINESS_WARNING_SERVICE,
|
||||||
|
fallbackFactory = RemoteWarningCRUDFactory.class)
|
||||||
|
public interface RemoteWarningCRUDFeign {
|
||||||
|
|
||||||
|
@PostMapping
|
||||||
|
public R<ApiRecord> saveApiRecord(@RequestBody ApiRecord apiRecord);
|
||||||
|
|
||||||
|
|
||||||
|
@PutMapping
|
||||||
|
public R<ApiRecord> updateApiRecord(@RequestBody ApiRecord apiRecord);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,89 @@
|
||||||
|
package com.xjs.business.warning.domain;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiejs
|
||||||
|
* @desc api记录实体类
|
||||||
|
* @create 2021-12-31
|
||||||
|
*/
|
||||||
|
public class ApiRecord implements Serializable {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
/** 主键id */
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
/** api名称 */
|
||||||
|
private String apiName;
|
||||||
|
|
||||||
|
/** api地址 */
|
||||||
|
private String apiUrl;
|
||||||
|
|
||||||
|
/** api总请求次数 */
|
||||||
|
private Long totalCount;
|
||||||
|
|
||||||
|
/** api限制请求次数每天 */
|
||||||
|
private Long limitCount;
|
||||||
|
|
||||||
|
private Date createTime;
|
||||||
|
|
||||||
|
private Date updateTime;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApiName() {
|
||||||
|
return apiName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApiName(String apiName) {
|
||||||
|
this.apiName = apiName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getApiUrl() {
|
||||||
|
return apiUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApiUrl(String apiUrl) {
|
||||||
|
this.apiUrl = apiUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getTotalCount() {
|
||||||
|
return totalCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalCount(Long totalCount) {
|
||||||
|
this.totalCount = totalCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Long getLimitCount() {
|
||||||
|
return limitCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLimitCount(Long limitCount) {
|
||||||
|
this.limitCount = limitCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getCreateTime() {
|
||||||
|
return createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCreateTime(Date createTime) {
|
||||||
|
this.createTime = createTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getUpdateTime() {
|
||||||
|
return updateTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUpdateTime(Date updateTime) {
|
||||||
|
this.updateTime = updateTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.xjs.business.warning.factory;
|
||||||
|
|
||||||
|
import com.ruoyi.common.core.domain.R;
|
||||||
|
import com.xjs.business.warning.RemoteWarningCRUDFeign;
|
||||||
|
import com.xjs.business.warning.domain.ApiRecord;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.cloud.openfeign.FallbackFactory;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiejs
|
||||||
|
* @desc 调用预警服务降级处理
|
||||||
|
* @create 2021-12-31
|
||||||
|
*/
|
||||||
|
@Component
|
||||||
|
public class RemoteWarningCRUDFactory implements FallbackFactory<RemoteWarningCRUDFeign> {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(RemoteWarningCRUDFactory.class);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RemoteWarningCRUDFeign create(Throwable cause) {
|
||||||
|
return new RemoteWarningCRUDFeign() {
|
||||||
|
@Override
|
||||||
|
public R<ApiRecord> saveApiRecord(ApiRecord apiRecord) {
|
||||||
|
log.error("调用预警服务添加接口失败----"+apiRecord.getApiName());
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R<ApiRecord> updateApiRecord(ApiRecord apiRecord) {
|
||||||
|
log.error("调用预警服务修改接口失败----"+apiRecord.getApiName());
|
||||||
|
return R.fail();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -26,4 +26,13 @@ public class ServiceNameConstants
|
||||||
* 第三方api业务服务的serviceid
|
* 第三方api业务服务的serviceid
|
||||||
*/
|
*/
|
||||||
public static final String BUSINESS_OPENAPI_SERVICE= "xjs-openapi" ;
|
public static final String BUSINESS_OPENAPI_SERVICE= "xjs-openapi" ;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 预警服务的serviceid
|
||||||
|
*/
|
||||||
|
public static final String BUSINESS_WARNING_SERVICE= "xjs-warning" ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
package com.xjs.common.aop;
|
package com.xjs.common.aop;
|
||||||
|
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import com.xjs.business.warning.RemoteWarningCRUDFeign;
|
||||||
import com.xjs.enums.StatusEnum;
|
import com.xjs.enums.StatusEnum;
|
||||||
import com.xjs.log.mapper.ApiLogMapper;
|
import com.xjs.log.mapper.ApiLogMapper;
|
||||||
import lombok.extern.log4j.Log4j2;
|
import lombok.extern.log4j.Log4j2;
|
||||||
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.JoinPoint;
|
||||||
import org.aspectj.lang.ProceedingJoinPoint;
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
import org.aspectj.lang.annotation.*;
|
import org.aspectj.lang.annotation.*;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
|
@ -27,6 +29,10 @@ public class ApiLogAspect {
|
||||||
@Resource
|
@Resource
|
||||||
private ApiLogMapper apiLogMapper;
|
private ApiLogMapper apiLogMapper;
|
||||||
|
|
||||||
|
//用来调用预警,记录预警信息
|
||||||
|
@Autowired
|
||||||
|
private RemoteWarningCRUDFeign remoteWarningCRUDFeign;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 声明AOP签名
|
* 声明AOP签名
|
||||||
*/
|
*/
|
||||||
|
|
@ -45,6 +51,17 @@ public class ApiLogAspect {
|
||||||
LocalDateTime localDateTime2 = DateUtil.date().toLocalDateTime();
|
LocalDateTime localDateTime2 = DateUtil.date().toLocalDateTime();
|
||||||
long between = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2);
|
long between = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2);
|
||||||
log.info("调用接口耗费时间:{}ms", between);
|
log.info("调用接口耗费时间:{}ms", between);
|
||||||
|
|
||||||
|
//执行预警切入逻辑
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|
|
||||||
|
|
@ -17,4 +17,12 @@
|
||||||
<maven.compiler.target>8</maven.compiler.target>
|
<maven.compiler.target>8</maven.compiler.target>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.xjs</groupId>
|
||||||
|
<artifactId>xjs-business-common</artifactId>
|
||||||
|
<version>3.3.0</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
|
@ -0,0 +1,37 @@
|
||||||
|
package com.xjs.controller;
|
||||||
|
|
||||||
|
import com.ruoyi.common.core.domain.R;
|
||||||
|
import com.ruoyi.common.core.web.controller.BaseController;
|
||||||
|
import com.xjs.domain.ApiRecord;
|
||||||
|
import com.xjs.service.ApiWarningService;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiejs
|
||||||
|
* @desc api预警控制器
|
||||||
|
* @create 2021-12-31
|
||||||
|
*/
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("apiwarning")
|
||||||
|
public class ApiWarningController extends BaseController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ApiWarningService apiWarningService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存 apiRecord
|
||||||
|
* @param apiRecord api记录
|
||||||
|
* @return apiRecord
|
||||||
|
*/
|
||||||
|
@PostMapping
|
||||||
|
public R<ApiRecord> saveApiRecord(@RequestBody ApiRecord apiRecord) {
|
||||||
|
return apiWarningService.saveApiRecord(apiRecord) ? R.ok() : R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping
|
||||||
|
public R<ApiRecord> updateApiRecord(@RequestBody ApiRecord apiRecord) {
|
||||||
|
return apiWarningService.updateApiRecord(apiRecord)? R.ok() : R.fail();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -11,7 +11,7 @@ import java.util.Date;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author xiejs
|
* @author xiejs
|
||||||
* @desc api记录实体类
|
* @desc api记录实体类
|
||||||
* @create 2021-12-31
|
* @create 2021-12-31
|
||||||
*/
|
*/
|
||||||
@TableName("api_record")
|
@TableName("api_record")
|
||||||
|
|
@ -20,30 +20,46 @@ public class ApiRecord implements Serializable {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
/** 主键id */
|
/**
|
||||||
|
* 主键id
|
||||||
|
*/
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/** api名称 */
|
/**
|
||||||
|
* api名称
|
||||||
|
*/
|
||||||
@Excel(name = "api名称")
|
@Excel(name = "api名称")
|
||||||
private String apiName;
|
private String apiName;
|
||||||
|
|
||||||
/** api地址 */
|
/**
|
||||||
|
* api地址
|
||||||
|
*/
|
||||||
@Excel(name = "api地址")
|
@Excel(name = "api地址")
|
||||||
private String apiUrl;
|
private String apiUrl;
|
||||||
|
|
||||||
/** api总请求次数 */
|
/**
|
||||||
|
* 请求耗费时间
|
||||||
|
*/
|
||||||
|
@Excel(name = "请求耗费时间")
|
||||||
|
private Integer requestTime;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* api总请求次数
|
||||||
|
*/
|
||||||
@Excel(name = "api总请求次数")
|
@Excel(name = "api总请求次数")
|
||||||
private Long totalCount;
|
private Long totalCount;
|
||||||
|
|
||||||
/** api限制请求次数每天 */
|
/**
|
||||||
|
* api限制请求次数每天
|
||||||
|
*/
|
||||||
@Excel(name = "api限制请求次数每天")
|
@Excel(name = "api限制请求次数每天")
|
||||||
private Long limitCount;
|
private Long limitCount;
|
||||||
|
|
||||||
@Excel(name = "创建时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
|
@Excel(name = "创建时间", dateFormat = "yyyy-MM-dd HH:mm:ss")
|
||||||
@TableField(fill = FieldFill.INSERT)
|
@TableField(fill = FieldFill.INSERT)
|
||||||
private Date createTime;
|
private Date createTime;
|
||||||
|
|
||||||
@Excel(name = "修改时间",dateFormat = "yyyy-MM-dd HH:mm:ss")
|
@Excel(name = "修改时间", dateFormat = "yyyy-MM-dd HH:mm:ss")
|
||||||
@TableField(fill = FieldFill.INSERT_UPDATE)
|
@TableField(fill = FieldFill.INSERT_UPDATE)
|
||||||
private Date updateTime;
|
private Date updateTime;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
package com.xjs.service;
|
||||||
|
|
||||||
|
import com.xjs.domain.ApiRecord;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiejs
|
||||||
|
* @desc
|
||||||
|
* @create 2021-12-31
|
||||||
|
*/
|
||||||
|
public interface ApiWarningService {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存apirecord 当存在相同api时,不允许保存
|
||||||
|
* @param apiRecord apiRecord
|
||||||
|
* @return apiRecord
|
||||||
|
*/
|
||||||
|
Boolean saveApiRecord(ApiRecord apiRecord);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改 根据url名称修改api调用次数
|
||||||
|
* @param apiRecord apiRecord
|
||||||
|
* @return apiRecord
|
||||||
|
*/
|
||||||
|
boolean updateApiRecord(ApiRecord apiRecord);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.xjs.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.xjs.domain.ApiRecord;
|
||||||
|
import com.xjs.exception.BusinessException;
|
||||||
|
import com.xjs.mapper.ApiRecordMapper;
|
||||||
|
import com.xjs.service.ApiWarningService;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author xiejs
|
||||||
|
* @desc api预警service实现类
|
||||||
|
* @create 2021-12-31
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ApiWarningServiceImpl implements ApiWarningService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ApiRecordMapper apiRecordMapper;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean saveApiRecord(ApiRecord apiRecord) {
|
||||||
|
ApiRecord apiName = apiRecordMapper
|
||||||
|
.selectOne(new QueryWrapper<ApiRecord>()
|
||||||
|
.eq("api_name", apiRecord.getApiName()));
|
||||||
|
if (Objects.nonNull(apiName)) {
|
||||||
|
throw new BusinessException("数据库存在相同url名称,保存失败!---" + apiRecord.getApiUrl());
|
||||||
|
} else {
|
||||||
|
apiRecordMapper.insert(apiRecord);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean updateApiRecord(ApiRecord apiRecord) {
|
||||||
|
int name = apiRecordMapper.update(apiRecord, new QueryWrapper<ApiRecord>()
|
||||||
|
.eq("api_name", apiRecord.getApiName()));
|
||||||
|
return name == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue