详细代码演示微服务中台监控,中台接口要能记录服务调用次数,服务调用来源,自定义注解,发送消息到MQ,数据交互平台从MQ消费消息,插入到数据库
时间: 2024-03-02 17:52:04 浏览: 43
好的,这是一个比较大的问题,需要分多个步骤来进行演示。下面我将详细介绍如何实现微服务中台监控,并记录服务调用次数、服务调用来源、自定义注解,以及发送消息到MQ和消费消息插入到数据库。
1. 添加依赖
首先,需要在项目中添加Spring Boot的Actuator和Sleuth依赖,这两个依赖可以提供基本的微服务监控功能和跟踪功能。
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
```
2. 自定义注解
为了记录服务调用来源,我们可以自定义一个注解`@Trace`,用于标识服务接口调用方。
```java
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Trace {
String value() default "";
}
```
3. 拦截器
为了记录服务调用次数和服务调用来源,我们需要使用拦截器,拦截服务接口的请求,然后进行记录。
```java
@Component
public class TraceInterceptor implements HandlerInterceptor {
private static final Logger LOGGER = LoggerFactory.getLogger(TraceInterceptor.class);
private final Tracer tracer;
private final CounterService counterService;
public TraceInterceptor(Tracer tracer, CounterService counterService) {
this.tracer = tracer;
this.counterService = counterService;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Span currentSpan = this.tracer.currentSpan();
if (currentSpan != null) {
String traceId = currentSpan.context().traceId();
String spanId = currentSpan.context().spanId();
LOGGER.info("TraceId: {}, SpanId: {}", traceId, spanId);
}
// 记录服务调用次数
String uri = request.getRequestURI();
this.counterService.increment(uri);
// 记录服务调用来源
Method method = ((HandlerMethod) handler).getMethod();
Trace traceAnnotation = AnnotationUtils.findAnnotation(method, Trace.class);
if (traceAnnotation != null) {
String source = traceAnnotation.value();
LOGGER.info("Source: {}", source);
}
return true;
}
}
```
4. MQ消息发送
为了将服务调用信息发送到MQ,我们需要使用Spring Boot提供的`RabbitTemplate`。
```java
@Service
public class TraceService {
private static final Logger LOGGER = LoggerFactory.getLogger(TraceService.class);
private final RabbitTemplate rabbitTemplate;
public TraceService(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}
public void sendTraceMessage(String message) {
LOGGER.info("Sending trace message: {}", message);
this.rabbitTemplate.convertAndSend("trace", message);
}
}
```
5. MQ消息消费
为了将服务调用信息插入到数据库,我们需要使用Spring Boot提供的`@RabbitListener`注解,来消费MQ中的消息。
```java
@Component
public class TraceMessageListener {
private static final Logger LOGGER = LoggerFactory.getLogger(TraceMessageListener.class);
private final JdbcTemplate jdbcTemplate;
public TraceMessageListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@RabbitListener(queues = "trace")
public void receiveTraceMessage(String message) {
LOGGER.info("Receiving trace message: {}", message);
String[] split = message.split(",");
String uri = split[0];
String source = split.length > 1 ? split[1] : "";
String sql = "INSERT INTO trace (uri, source) VALUES (?, ?)";
this.jdbcTemplate.update(sql, uri, source);
}
}
```
6. 配置文件
最后,我们需要在配置文件中进行配置,包括MQ的相关信息、拦截器、消息队列等。
```yaml
spring:
application:
name: demo
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
sleuth:
sampler:
probability: 1.0
management:
endpoints:
web:
exposure:
include: "*"
metrics:
tags:
application: ${spring.application.name}
logging:
level:
com:
example:
demo: DEBUG
server:
port: 8080
trace:
mq:
queue: trace
```
以上就是微服务中台监控的实现过程,包括记录服务调用次数、服务调用来源、自定义注解、发送消息到MQ和消费消息插入到数据库。