微服务架构中的日志聚合、分布式追踪与容器化实践
立即解锁
发布时间: 2025-08-12 00:15:32 阅读量: 17 订阅数: 29 


Spring Boot 3微服务实战指南
### 微服务架构中的日志聚合、分布式追踪与容器化实践
在微服务架构中,日志管理、分布式追踪以及服务的部署是非常重要的环节。本文将详细介绍如何实现日志聚合、使用Spring Cloud Sleuth进行分布式追踪,以及利用Docker进行容器化部署。
#### 1. 日志聚合
当所有日志都发布到一个交换器后,我们需要构建一个消费者端的微服务来消费这些消息并将它们输出。以下是具体步骤:
1. **创建日志项目**:
- 访问Spring Initializr网站(https://start.spring.io/),使用Maven和JDK 17创建一个日志项目。
- 在依赖列表中添加Spring for RabbitMQ、Spring Web、Validation、Spring Boot Actuator、Lombok和Consul Configuration。注意不要添加Consul Discovery,因为该服务不需要被发现。
2. **配置项目**:
- 将其他项目中的bootstrap.properties文件内容复制到新项目的main/src/resources文件夹中。
- 在application.properties文件中设置应用名称和专用端口:
```properties
spring.application.name=logs
server.port=8580
```
3. **创建Spring Boot配置类**:
- 声明交换器、队列和绑定对象,用于消费所有包含特殊字符(#)的消息。
```java
package microservices.book.logs;
import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AMQPConfiguration {
@Bean
public TopicExchange logsExchange() {
return ExchangeBuilder.topicExchange("logs.topic")
.durable(true)
.build();
}
@Bean
public Queue logsQueue() {
return QueueBuilder.durable("logs.queue").build();
}
@Bean
public Binding logsBinding(final Queue logsQueue,
final TopicExchange logsExchange) {
return BindingBuilder.bind(logsQueue)
.to(logsExchange).with("#");
}
}
```
4. **创建日志消费者服务**:
- 使用`@RabbitListener`注解将接收到的消息的日志级别映射到日志微服务中的日志级别。
```java
package microservices.book.logs;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Service;
import org.slf4j.Marker;
import org.slf4j.MarkerFactory;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class LogsConsumer {
@RabbitListener(queues = "logs.queue")
public void log(final String msg,
@Header("level") String level,
@Header("amqp_appId") String appId) {
Marker marker = MarkerFactory.getMarker(appId);
switch (level) {
case "INFO" -> log.info(marker, msg);
case "ERROR" -> log.error(marker, msg);
case "WARN" -> log.warn(marker, msg);
}
}
}
```
5. **自定义日志输出格式**:
- 在logback-spring.xml文件中定义简单的格式,输出标记、级别和消息。
```xml
<configuration>
<appender name="CONSOLE"
class="ch.qos.logback.core.ConsoleAppender" >
<layout class="ch.qos.logback.classic.PatternLayout" >
<Pattern>
[%-15marker] %highlight(%-5level) %msg%n
</Pattern>
</layout>
</appender>
<root level="INFO" >
<appender-ref ref="CONSOLE" />
</root>
</configuration>
```
6. **启动服务**:
- 依次运行RabbitMQ服务器、Consul代理、Multiplication微服务、Gamification微服务、Gateway微服务、Logs微服务和前端应用。
- 启动Logs微服务后,它将消费其他应用产生的所有日志消息。例如,解决一个挑战后,Logs微服务的控制台将显示如下日志:
```
[multiplication ] INFO 15:14:20.203 [http-nio-8080-exec-1] m.b.m.c.ChallengeAttemptController - Received new attempt from test1
[gamification ] INFO 15:14:20.357 [org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] m.b.g.game.GameEventHandler - C
```
0
0
复制全文
相关推荐










