代码详细演示设计一个中台监控,中台接口要能记录服务调用次数,服务调用来源,起始时间,结束时间自定义注解,发送消息到MQ,数据交互平台从MQ消费消息,插入到数据库
时间: 2024-03-05 10:53:26 浏览: 71
好的,我来为您详细演示设计一个中台监控。
首先,我们需要在中台接口上增加一个自定义注解 `@Monitor`,用于标识需要监控的服务接口。这个注解需要包含以下参数:
- `name`:监控数据的名称,可以自定义。
- `source`:服务调用来源,可以是系统名、模块名等。
- `mq`:是否发送消息到MQ,可以为 `true` 或 `false`。
代码如下:
```java
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Monitor {
String name();
String source();
boolean mq() default false;
}
```
接着,我们需要创建一个切面类 `MonitorAspect`,用于在方法调用前后进行拦截,并记录监控数据。代码如下:
```java
@Aspect
@Component
public class MonitorAspect {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private RabbitTemplate rabbitTemplate;
@Pointcut("@annotation(com.example.demo.monitor.Monitor)")
public void monitorPointcut() {}
@Around("monitorPointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Monitor monitor = method.getAnnotation(Monitor.class);
String name = monitor.name();
String source = monitor.source();
boolean mq = monitor.mq();
long startTime = System.currentTimeMillis();
Object result = joinPoint.proceed();
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
int count = 1;
// 记录监控数据
logger.info("Monitor - Name: {}, Source: {}, Count: {}, Time: {}ms", name, source, count, time);
// 发送消息到MQ
if (mq) {
Map<String, Object> message = new HashMap<>();
message.put("name", name);
message.put("source", source);
message.put("count", count);
message.put("time", time);
rabbitTemplate.convertAndSend("monitor.exchange", "monitor.routingKey", message);
logger.info("Message sent to MQ: {}", message);
}
return result;
}
}
```
在切面类中,我们使用 `@Pointcut` 注解定义一个切点,用于匹配被 `@Monitor` 注解标识的方法。然后,在 `around` 方法中,我们获取方法的注解信息,并记录调用次数、起始时间、结束时间等监控数据。最后,根据 `mq` 参数决定是否将监控数据发送到MQ中。
接下来,我们需要创建一个消息消费者,用于从MQ中消费监控数据,并将其插入到数据库中。代码如下:
```java
@Component
@RabbitListener(queues = "monitor.queue")
public class MonitorMessageConsumer {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JdbcTemplate jdbcTemplate;
@RabbitHandler
public void handleMessage(Map<String, Object> message) {
String name = (String) message.get("name");
String source = (String) message.get("source");
int count = (int) message.get("count");
long time = (long) message.get("time");
String sql = "INSERT INTO monitor_data(name, source, count, time) VALUES(?, ?, ?, ?)";
jdbcTemplate.update(sql, name, source, count, time);
logger.info("Monitor data inserted into database - Name: {}, Source: {}, Count: {}, Time: {}ms", name, source, count, time);
}
}
```
在消息消费者中,我们使用 `@RabbitListener` 注解指定要监听的队列。然后,在 `handleMessage` 方法中,我们从消息中获取监控数据,并将其插入到数据库中。
最后,我们需要在配置文件中配置相关信息,如MQ连接信息、数据库连接信息等。配置文件如下:
```yaml
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: root
password: root
```
好了,以上就是详细的中台监控的设计和实现过程。
阅读全文