代码详细点说明:java后端做一个运维监控,中台接口要能记录服务调用次数,服务调用来源 ,自定义注解,发送消息到MQ,包括数据交互平台从MQ消费消息,插入到数据库的步骤
时间: 2024-02-07 22:03:52 浏览: 175
好的,我会详细说明实现步骤,包括服务调用次数、服务调用来源的记录,自定义注解的使用,发送MQ消息,以及数据交互平台从MQ消费消息并插入到数据库中。
1. 定义自定义注解
我们首先需要定义一个自定义注解,用于标记需要被监控的服务方法。这里我们定义一个@Monitor注解。
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Monitor {
}
```
2. 在服务方法上添加@Monitor注解
在需要被监控的服务方法上添加@Monitor注解。
```java
@Monitor
public void someMethod() {
// 方法体
}
```
3. 使用AOP拦截服务方法
使用AOP技术,在服务方法调用前和调用后,执行相应的操作。我们可以定义一个切面类,在切面类中编写相应的代码。
```java
@Aspect
@Component
public class MonitorAspect {
@Autowired
private RabbitTemplate rabbitTemplate;
private Map<String, Integer> methodCountMap = new ConcurrentHashMap<>();
@Before("@annotation(monitor)")
public void beforeMethod(JoinPoint joinPoint, Monitor monitor) {
// 记录调用次数
String methodName = joinPoint.getSignature().getName();
methodCountMap.put(methodName, methodCountMap.getOrDefault(methodName, 0) + 1);
// 记录调用来源
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String source = attributes.getRequest().getRemoteAddr();
// 将信息发送到MQ消息队列
String message = "服务 " + methodName + " 被调用了,调用来源:" + source;
rabbitTemplate.convertAndSend("monitor.exchange", "monitor.routingKey", message);
}
@AfterReturning("@annotation(monitor)")
public void afterMethod(JoinPoint joinPoint, Monitor monitor) {
// 记录调用次数
String methodName = joinPoint.getSignature().getName();
methodCountMap.put(methodName, methodCountMap.getOrDefault(methodName, 0) + 1);
// 记录调用来源
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String source = attributes.getRequest().getRemoteAddr();
// 将信息发送到MQ消息队列
String message = "服务 " + methodName + " 调用完成,调用来源:" + source;
rabbitTemplate.convertAndSend("monitor.exchange", "monitor.routingKey", message);
}
@Scheduled(initialDelay = 10000, fixedDelay = 60000)
public void reportMethodCount() {
// 定时上报调用次数
StringBuilder message = new StringBuilder("服务调用次数统计:\n");
for (String methodName : methodCountMap.keySet()) {
message.append(methodName).append(": ").append(methodCountMap.get(methodName)).append("\n");
}
rabbitTemplate.convertAndSend("monitor.exchange", "monitor.routingKey", message.toString());
}
}
```
在切面类中,我们使用@Before和@AfterReturning注解来分别拦截服务方法的调用前和调用后。在调用前,我们记录调用次数和调用来源,并将信息发送到MQ消息队列。在调用后,我们同样记录调用次数和调用来源,并将信息发送到MQ消息队列。此外,我们还定义了一个定时任务,用于定时上报调用次数统计信息。
4. 发送MQ消息
在切面类中,我们使用RabbitTemplate发送MQ消息。我们需要在Spring Boot的配置文件中,配置RabbitMQ的连接信息。
```yaml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
```
5. 数据交互平台消费MQ消息并插入到数据库
我们需要编写一个消费者,从MQ消息队列中消费消息,并将消息插入到数据库中。这里我们使用Spring Boot提供的@RabbitListener注解,来监听MQ消息队列中的消息。
```java
@Component
public class MonitorMessageConsumer {
@Autowired
private MonitorMessageRepository repository;
@RabbitListener(queues = "monitor.queue")
public void receiveMessage(String message) {
MonitorMessage monitorMessage = new MonitorMessage();
monitorMessage.setMessage(message);
monitorMessage.setCreateTime(new Date());
repository.save(monitorMessage);
}
}
```
在消费者中,我们使用@Repository注解标记了一个MonitorMessageRepository,用于操作数据库。我们使用@RabbitListener注解监听MQ消息队列中的消息,将消息插入到数据库中。
以上就是Java后端做一个运维监控,中台接口能记录服务调用次数,服务调用来源,自定义注解,发送消息到MQ,数据交互平台能从MQ消费消息并插入到数据库的详细步骤。
阅读全文