完整代码展示:java后端做一个运维监控,中台接口要能记录服务调用次数,服务调用来源 ,自定义注解,发送消息到MQ,包括数据交互平台从MQ消费消息,插入到数据库的实现
时间: 2024-02-05 19:02:44 浏览: 128
好的,以下是一个基于Spring Boot框架的Java后端运维监控的实现代码:
1. 自定义注解
首先,我们需要定义一个自定义注解来标记哪些接口需要进行监控,代码如下:
```java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Monitor {
String name(); // 接口名称
String desc() default ""; // 接口描述
}
```
2. 中台接口记录服务调用次数和来源
接下来,在我们的中台接口中,需要记录服务的调用次数和来源。我们可以通过AOP来实现,代码如下:
```java
@Aspect
@Component
public class MvcAspect {
@Autowired
private HttpServletRequest request;
private static final Logger logger = LoggerFactory.getLogger(MvcAspect.class);
@Pointcut("@annotation(com.example.demo.annotation.Monitor)")
public void pointcut() {
}
@Around("pointcut()")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
long beginTime = System.currentTimeMillis();
// 获取被注解的接口的名称和描述信息
MethodSignature signature = (MethodSignature) pjp.getSignature();
Method method = signature.getMethod();
Monitor monitor = method.getAnnotation(Monitor.class);
String interfaceName = monitor.name();
String interfaceDesc = monitor.desc();
// 获取请求来源IP地址
String remoteAddr = request.getHeader("X-Real-IP");
if (StringUtils.isBlank(remoteAddr)) {
remoteAddr = request.getHeader("X-Forwarded-For");
if (StringUtils.isBlank(remoteAddr)) {
remoteAddr = request.getRemoteAddr();
}
}
// 记录请求次数和来源
logger.info("接口【{}】被调用,来自IP地址【{}】", interfaceName, remoteAddr);
// 统计接口调用次数
CounterService counterService = new CounterServiceImpl();
counterService.increment(interfaceName);
// 执行被注解的方法
Object result = pjp.proceed();
// 记录接口耗时
long endTime = System.currentTimeMillis();
logger.info("接口【{}】耗时【{}】ms", interfaceName, (endTime - beginTime));
return result;
}
}
```
在上面的代码中,我们使用了Spring Boot提供的AOP功能,通过@Around和@Pointcut注解定义了一个切面,该切面只会拦截被@Monitor注解标记的接口。在接口被调用前,我们记录了接口的名称和描述信息,同时获取了请求的来源IP地址。在接口被调用后,我们统计了接口的调用次数,并记录了接口的耗时。
3. 发送消息到MQ
接下来,我们需要将接口的监控数据发送到MQ中,以便其他数据交互平台可以消费这些数据。我们可以使用Spring Boot提供的RabbitMQ来实现,代码如下:
```java
@Service
public class RabbitMqSender {
private static final Logger logger = LoggerFactory.getLogger(RabbitMqSender.class);
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMonitorData(String data) {
logger.info("发送MQ消息,消息内容:{}", data);
rabbitTemplate.convertAndSend("monitor-exchange", "monitor-routing-key", data);
}
}
```
在上面的代码中,我们定义了一个RabbitMQ的消息发送器,通过调用convertAndSend方法将监控数据发送到MQ中。在发送之前,我们使用了日志记录该消息的内容。
4. 数据交互平台消费MQ消息并插入数据库
最后,我们需要在数据交互平台中消费MQ中的监控数据,并将其插入到数据库中。代码如下:
```java
@Component
public class RabbitMqReceiver {
private static final Logger logger = LoggerFactory.getLogger(RabbitMqReceiver.class);
@Autowired
private MonitorDataService monitorDataService;
@RabbitListener(queues = "monitor-queue")
public void receiveMonitorData(String data) {
logger.info("接收到MQ消息,消息内容:{}", data);
// 解析消息,将监控数据插入到数据库中
MonitorData monitorData = new MonitorData();
JSONObject jsonObject = JSONObject.parseObject(data);
monitorData.setInterfaceName(jsonObject.getString("interfaceName"));
monitorData.setInterfaceDesc(jsonObject.getString("interfaceDesc"));
monitorData.setInvokeCount(jsonObject.getInteger("invokeCount"));
monitorData.setLastInvokeTime(new Date(jsonObject.getLong("lastInvokeTime")));
monitorDataService.insertMonitorData(monitorData);
}
}
```
在上面的代码中,我们定义了一个RabbitMQ的消息接收器,通过@RabbitListener注解来监听"monitor-queue"队列中的消息。当接收到消息后,我们将其解析为MonitorData对象,并调用MonitorDataService的insertMonitorData方法将数据插入到数据库中。
以上就是一个基于Spring Boot框架的Java后端运维监控的实现代码。
阅读全文