目录
微服务架构集成
1. 微服务日志聚合架构
2. 分布式追踪集成
Jaeger集成配置:
# docker-compose.yml
version: '3.8'
services:
jaeger:
image: jaegertracing/all-in-one:latest
ports:
- "16686:16686"
- "14268:14268"
environment:
- COLLECTOR_OTLP_ENABLED=true
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
depends_on:
- elasticsearch
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:8.11.0
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
logstash:
image: docker.elastic.co/logstash/logstash:8.11.0
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
- ./logstash/config:/usr/share/logstash/config
ports:
- "5044:5044"
depends_on:
- elasticsearch
Spring Boot微服务集成:
// pom.xml
<dependencies>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-jaeger</artifactId>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.4</version>
</dependency>
</dependencies>
// TracingConfiguration.java
@Configuration
public class TracingConfiguration {
@Bean
public OpenTelemetry openTelemetry() {
return OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(
JaegerGrpcSpanExporter.builder()
.setEndpoint("http://jaeger:14250")
.build())
.build())
.setResource(Resource.getDefault()
.merge(Resource.create(
Attributes.of(ResourceAttributes.SERVICE_NAME, "user-service"))))
.build())
.build();
}
}
// UserController.java
@RestController
@RequestMapping("/api/users")
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private final Tracer tracer;
public UserController(OpenTelemetry openTelemetry) {
this.tracer = openTelemetry.getTracer("user-service");
}
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
Span span = tracer.spanBuilder("get-user")
.setAttribute("user.id", id)
.startSpan();
try (Scope scope = span.makeCurrent()) {
logger.info("Getting user with id: {}", id);
// 业务逻辑
User user = userService.findById(id);
span.setStatus(StatusCode.OK);
return ResponseEntity.ok(user);
} catch (Exception e) {
span.setStatus(StatusCode.ERROR, e.getMessage());
logger.error("Error getting user: {}", e.getMessage(), e);
throw e;
} finally {
span.end();
}
}
}
Logback配置:
<!-- logback-spring.xml -->
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<springProfile name="!local">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp/>
<logLevel/>
<loggerName/>
<message/>
<mdc/>
<arguments/>
<stackTrace/>
<pattern>
<pattern>
{
"service": "user-service",
"version": "${app.version:-unknown}",
"environment": "${spring.profiles.active:-unknown}",
"trace_id": "%X{traceId:-}",
"span_id": "%X{spanId:-}"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
</springProfile>
<springProfile name="local">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level [%X{traceId:-},%X{spanId:-}] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</springProfile>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3. 服务网格集成
Istio + ELK集成:
# istio-telemetry.yaml
apiVersion: telemetry.istio.io/v1alpha1
kind