侧边栏壁纸
  • 累计撰写 77 篇文章
  • 累计创建 29 个标签
  • 累计收到 21 条评论

目 录CONTENT

文章目录

SkyWalking + Spring Boot 3.x 分布式链路追踪实战全攻略:微服务可观测性完全指南

Administrator
2026-03-30 / 0 评论 / 0 点赞 / 0 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

📌 前言

在微服务架构中,一个用户请求可能会穿过数十个服务节点。当系统出现问题时,如何快速定位故障点?这就是 分布式链路追踪(Distributed Tracing) 的核心价值。

可观测性三支柱(Observability Triangle)包括:

  • 📊 指标(Metrics):Prometheus + Grafana
  • 📝 日志(Logs):ELK Stack
  • 🔗 链路追踪(Tracing):SkyWalking ← 今天的主角

本文详细讲解如何使用 Apache SkyWalking 在 Spring Boot 3.x 微服务中实现分布式链路追踪,包括自动探针、自定义埋点、性能分析、告警规则等完整实战。


🎯 什么是 SkyWalking?

SkyWalking 核心特性

特性描述
零入侵Java Agent 字节码增强,无需修改代码
自动追踪自动捕获 HTTP、RPC、数据库、MQ 等调用
性能分析拓扑图、调用链路、响应时间分析
告警规则支持自定义告警,如 SLA、错误率、响应时间
轻量级相比 Jaeger/Zipkin 开销小,适合生产环境
中文友好文档完善,社区活跃

SkyWalking vs 其他方案

┌─────────────────────────────────────┐
│        分布式追踪方案对比           │
├─────────────────────────────────────┤
│ Jaeger:  完整的追踪系统,功能全面  │
│ Zipkin:  Twitter 开源,生态完整    │
│ Pinpoint: Naver 开源,Java 优先    │
│ SkyWalking: 国人开源,轻量级高效  │
└─────────────────────────────────────┘

🚀 环境准备与 SkyWalking 部署

1. SkyWalking 组件架构

┌──────────────────────────────────────────────────────────┐
│                    SkyWalking 架构                        │
├──────────────────────────────────────────────────────────┤
│                                                          │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │  应用 1 Agent   │  │  应用 2 Agent   │              │
│  │  (Java Agent)   │  │  (Java Agent)   │              │
│  └────────┬────────┘  └────────┬────────┘              │
│           │                    │                        │
│           └────────┬───────────┘                        │
│                    │                                    │
│           ┌────────▼─────────┐                         │
│           │  SkyWalking OAP  │  (Observability        │
│           │  (Collector)     │   Analysis Platform)    │
│           └────────┬─────────┘                         │
│                    │                                    │
│        ┌───────────┼───────────┐                       │
│        │           │           │                       │
│   ┌────▼──┐  ┌────▼──┐  ┌────▼──┐                    │
│   │ MySQL │  │ ES 8  │  │ Redis │                    │
│   │ (元数│  │(数据) │  │(缓存) │                    │
│   │  据) │  │       │  │       │                    │
│   └───────┘  └───────┘  └───────┘                    │
│        │                                              │
│   ┌────▼──────────────────┐                         │
│   │   SkyWalking UI       │                         │
│   │   (可视化展示)        │                         │
│   └───────────────────────┘                         │
│                                                      │
└──────────────────────────────────────────────────────┘

2. Docker Compose 快速部署 SkyWalking 9.x

# docker-compose.yml
version: '3.8'

services:
  # Elasticsearch 数据存储
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: skywalking-es
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - xpack.watcher.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ports:
      - "9200:9200"
    networks:
      - skywalking-network

  # SkyWalking OAP (数据收集与分析)
  oap:
    image: apache/skywalking-oap-server:9.7.0
    container_name: skywalking-oap
    environment:
      SW_STORAGE: elasticsearch
      SW_ES_HTTP_HOST: elasticsearch
      SW_ES_HTTP_PORT: 9200
      SW_TELEMETRY: prometheus
      JAVA_OPTS: "-Xms256m -Xmx256m"
    ports:
      - "11800:11800"
      - "12800:12800"
    depends_on:
      - elasticsearch
    networks:
      - skywalking-network

  # SkyWalking UI (可视化界面)
  ui:
    image: apache/skywalking-ui:9.7.0
    container_name: skywalking-ui
    ports:
      - "8080:8080"
    environment:
      SW_OAP_ADDRESS: http://oap:12800
    depends_on:
      - oap
    networks:
      - skywalking-network

networks:
  skywalking-network:
    driver: bridge

启动 SkyWalking:

docker-compose up -d

# 验证服务状态
docker-compose logs -f oap

# 访问 UI 界面
# http://localhost:8080

📱 Spring Boot 3.x 集成 SkyWalking

1. 依赖配置

方案 A:Java Agent(推荐)- 零入侵

# 下载 SkyWalking Java Agent
wget https://archive.apache.org/dist/skywalking/9.7.0/apache-skywalking-java-agent-9.7.0.tar.gz
tar -zxvf apache-skywalking-java-agent-9.7.0.tar.gz

# 解压后结构
skywalking-agent/
├── agent/
│   └── skywalking-agent.jar
├── config/
│   └── agent.config
└── plugins/
    ├── apm-dubbo-plugin-9.7.0.jar
    ├── apm-spring-boot-plugin-9.7.0.jar
    ├── apm-httpClient-4.x-plugin-9.7.0.jar
    └── ...

方案 B:SDK 依赖

<!-- pom.xml -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-spring-boot-starter</artifactId>
    <version>9.7.0</version>
</dependency>

<!-- Instrumentation for Spring Boot -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-trace</artifactId>
    <version>9.7.0</version>
</dependency>

<!-- Instrumentation for OpenTelemetry -->
<dependency>
    <groupId>org.apache.skywalking</groupId>
    <artifactId>apm-toolkit-opentelemetry</artifactId>
    <version>9.7.0</version>
</dependency>

2. Spring Boot 应用启动配置

方案 A:Java Agent 启动(推荐)

# 启动脚本:start.sh
#!/bin/bash

SKYWALKING_AGENT_HOME=/opt/skywalking-agent
SKYWALKING_AGENT=$SKYWALKING_AGENT_HOME/agent/skywalking-agent.jar
SKYWALKING_SERVICE_NAME="your-service-name"
SKYWALKING_COLLECTOR_BACKEND_SERVICES="127.0.0.1:11800"

java -javaagent:$SKYWALKING_AGENT \
  -Dskywalking.agent.service_name=$SKYWALKING_SERVICE_NAME \
  -Dskywalking.collector.backend_service=$SKYWALKING_COLLECTOR_BACKEND_SERVICES \
  -Dskywalking.agent.namespace=prod \
  -Dskywalking.agent.instance_name=$(hostname) \
  -jar application.jar

方案 B:application.yml 配置

# application.yml
spring:
  application:
    name: order-service  # 服务名称,会在 SkyWalking 中显示

skywalking:
  agent:
    service_name: order-service
    sample_n_per_3_secs: 9    # 每 3 秒采样 9 条追踪
    authentication: your-token # 如果 OAP 开启认证
  collector:
    backend_service: 127.0.0.1:11800  # OAP 服务地址

3. 自动追踪的核心技术栈

SkyWalking Java Agent 自动支持:

技术栈支持情况说明
HTTPServlet、Spring MVC、Spring WebFlux
RPCDubbo、gRPC、Hystrix
数据库JDBC、MyBatis、JPA、MongoDB
消息队列RabbitMQ、RocketMQ、Kafka、ActiveMQ
缓存Redis、Memcached
SpringSpring Cloud、Spring Boot、Spring Data

🔍 自动追踪实战

1. 基础 HTTP 请求链路

无需任何代码改动,启动 Agent 后自动追踪:

// OrderController.java - 无需修改
@RestController
@RequestMapping("/api/orders")
public class OrderController {
    
    @Autowired
    private OrderService orderService;
    
    @PostMapping
    public ResponseEntity<OrderDTO> createOrder(@RequestBody CreateOrderRequest request) {
        // SkyWalking 自动捕获:
        // 1. HTTP 入口 (POST /api/orders)
        // 2. 下游服务调用
        // 3. 数据库操作
        OrderDTO order = orderService.create(request);
        return ResponseEntity.ok(order);
    }
}

2. 跨服务调用链路

场景:订单服务 → 库存服务 → 支付服务

// OrderService - 调用库存服务
@Service
public class OrderService {
    
    @Autowired
    private RestTemplate restTemplate;
    
    public void createOrder(CreateOrderRequest request) {
        // 1. 调用库存服务
        String inventoryUrl = "http://inventory-service/api/inventory/reserve";
        HttpEntity<ReserveRequest> entity = new HttpEntity<>(
            new ReserveRequest(request.getProductId(), request.getQuantity())
        );
        
        // ✅ SkyWalking 自动追踪此 HTTP 调用
        ResponseEntity<InventoryResponse> response = restTemplate.exchange(
            inventoryUrl, 
            HttpMethod.POST, 
            entity, 
            InventoryResponse.class
        );
        
        if (!response.getBody().isSuccess()) {
            throw new BusinessException("库存不足");
        }
        
        // 2. 调用支付服务
        paymentService.pay(request.getPaymentInfo());
    }
}

SkyWalking UI 中看到的链路图:

┌──────────────────────────────────────────────────┐
│        HTTP POST /api/orders (Entry Span)        │
│         响应时间: 523ms, 状态: 成功              │
└──────────────────┬───────────────────────────────┘
                   │
     ┌─────────────┼─────────────┐
     │             │             │
┌────▼──────┐ ┌────▼──────┐ ┌───▼──────┐
│库存服务    │ │OrderService│ │支付服务  │
│POST /api/..│ │(Service)   │ │POST /api │
│145ms       │ │178ms       │ │200ms     │
└───────────┘ └────────────┘ └──────────┘
     │             │             │
     └─────────────┼─────────────┘
                   │
            ┌──────▼──────┐
            │ MySQL       │
            │ INSERT      │
            │ 12ms        │
            └─────────────┘

3. 数据库操作追踪

// OrderRepository - 自动追踪 JDBC 操作
@Repository
public class OrderRepository extends JpaRepository<Order, Long> {
    
    // ✅ SkyWalking 自动追踪:
    // - SQL 语句
    // - 执行时间
    // - 参数绑定
    // - 异常信息
    
    @Query("SELECT o FROM Order o WHERE o.status = :status")
    List<Order> findByStatus(@Param("status") OrderStatus status);
}

// 执行时 SkyWalking 记录:
// Span Type: Database
// Database: MySQL
// SQL: SELECT * FROM order WHERE status = ?
// Duration: 8ms

4. 消息队列追踪

// RocketMQ 生产者 - 自动追踪消息发送
@Service
public class OrderProducer {
    
    @Autowired
    private RocketMQTemplate rocketMQTemplate;
    
    public void sendOrderCreatedEvent(Order order) {
        // ✅ SkyWalking 自动追踪:
        // - 消息发送
        // - 消息 ID
        // - 发送状态
        rocketMQTemplate.convertAndSend(
            "order-created-topic",
            order
        );
    }
}

// RocketMQ 消费者 - 自动追踪消息消费
@Service
public class OrderEventListener {
    
    @RocketMQMessageListener(
        topic = "order-created-topic",
        consumerGroup = "order-service-group"
    )
    public class OrderCreatedConsumer implements RocketMQListener<Order> {
        
        @Override
        public void onMessage(Order order) {
            // ✅ SkyWalking 记录整个消费链路
            processOrder(order);
        }
    }
}

// 追踪结果显示:
// Producer Span: Send Message to order-created-topic (3ms)
// Consumer Span: Consume Message (125ms)
// 完整的异步链路可视化

🎨 自定义埋点与手动追踪

1. @Trace 注解自定义埋点

import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;

@Service
public class OrderService {
    
    // ✅ 标记此方法为一个独立的 Span
    @Trace
    public void processOrder(Order order) {
        // 自动记录:
        // - 方法调用
        // - 执行时间
        // - 异常信息
        
        validateOrder(order);
        reserveInventory(order);
        deductPayment(order);
    }
    
    // 获取当前的 Trace ID(用于日志关联)
    @Trace
    public String getTraceId() {
        return TraceContext.traceId();  // 返回当前链路的全局唯一 ID
    }
}

2. 手动创建 Span

import org.apache.skywalking.apm.toolkit.trace.Trace;
import org.apache.skywalking.apm.toolkit.trace.TraceContext;

@Service
public class PaymentService {
    
    private static final String OPERATION_NAME = "Payment Processing";
    
    public void processPayment(Payment payment) {
        // 场景:需要追踪自定义业务逻辑(如数据处理、算法计算等)
        
        // 方式 1:使用 @Trace 注解
        executePayment(payment);
        
        // 方式 2:手动创建 Span(更灵活)
        try {
            // 业务代码
            System.out.println("处理支付...");
            
            // 获取 Trace 信息(关联日志)
            String traceId = TraceContext.traceId();
            String spanId = TraceContext.spanId();
            
            LOGGER.info("Payment processing - traceId: {}, spanId: {}", traceId, spanId);
            
        } catch (Exception e) {
            LOGGER.error("Payment failed - traceId: {}", TraceContext.traceId(), e);
            throw e;
        }
    }
    
    @Trace
    private void executePayment(Payment payment) {
        // 自动记录此方法
    }
}

3. 将 Trace ID 关联到日志

// 配置 logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="APPLICATION_NAME" source="spring.application.name"/>

    <!-- ✅ 包含 Trace ID 和 Span ID -->
    <property name="LOG_PATTERN" 
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [TraceId:%X{traceId}] [SpanId:%X{spanId}] %msg%n"/>

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>logs/${APPLICATION_NAME}.log</file>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>logs/${APPLICATION_NAME}-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxFileSize>100MB</maxFileSize>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

日志输出示例:

2026-03-30 14:23:45.123 [http-nio-8080-exec-1] INFO  OrderService - [TraceId:f8f9c1d2e3a4b5c6d7e8f9] [SpanId:1] Order creation started
2026-03-30 14:23:45.234 [http-nio-8080-exec-1] INFO  InventoryService - [TraceId:f8f9c1d2e3a4b5c6d7e8f9] [SpanId:2] Inventory check completed
2026-03-30 14:23:45.456 [http-nio-8080-exec-1] INFO  PaymentService - [TraceId:f8f9c1d2e3a4b5c6d7e8f9] [SpanId:3] Payment processed

📊 SkyWalking UI 完全指南

1. 仪表盘(Dashboard)

功能说明
服务拓扑图显示所有服务间的调用关系(实时更新)
关键指标服务数、实例数、端点数、追踪数
健康度绿(正常)、黄(告警)、红(异常)

2. 链路追踪(Tracing)

检索链路流程:
1. 输入服务名称和时间范围
2. 点击"搜索"查看符合条件的链路列表
3. 点击具体链路查看详细信息
4. 查看:
   - 请求流程图
   - 时间线
   - Span 详情
   - 日志内容
   - 异常信息

3. 性能分析(Performance)

  • 服务性能: p50、p75、p90、p95、p99 响应时间
  • 错误率: 请求失败率,错误趋势
  • 吞吐量: RPS(每秒请求数)、TPS(每秒事务数)
  • SLA: 服务可用性百分比

4. 告警面板(Alert)

# alert.yml
rules:
  - name: "高错误率告警"
    metrics: "service_error_rate"
    op: ">"
    threshold: 0.05        # 5%
    duration: "5m"
    silence: "10m"
    
  - name: "响应时间告警"
    metrics: "service_p95"
    op: ">"
    threshold: 1000        # 毫秒
    duration: "3m"
    
  - name: "实例异常告警"
    metrics: "service_instance_resp_time"
    op: ">"
    threshold: 2000
    duration: "2m"

🔧 性能优化与最佳实践

1. 采样策略(Sampling)

# agent.config
agent.sample_n_per_3_secs=9           # 每 3 秒采样 9 条链路
agent.trace_limit_per_segment=300     # 单个链路最多 300 个 Span
agent.layer=http                      # 追踪层级

采样配置建议:

环境采样率原因
开发环境100%需要完整的链路数据
测试环境50%平衡性能和数据完整性
生产环境10-30%降低系统开销,关注关键链路

2. 告警规则设计

// 创建告警规则示例
// 场景:订单服务端点请求失败率超过 1% 时告警

@Configuration
public class AlertConfig {
    
    // 定义告警阈值
    private static final double ERROR_RATE_THRESHOLD = 0.01;  // 1%
    private static final long CHECK_INTERVAL = 60000;  // 每 60 秒检查一次
    
    @Bean
    public void configureAlert() {
        // 在 SkyWalking UI 中配置:
        // Condition: "service_resp_time > 1000" (1000ms)
        // Duration: "5m"
        // Action: Send Alert to Webhook
    }
}

3. 链路数据保留策略

# OAP 配置
storage:
  elasticsearch:
    # 链路数据保留时间
    traceIndexShardingPolicy: "day"           # 按天分片
    
    # TTL 设置
    datasource_metrics_retention_period: 7    # 7 天
    metrics_record_retention_period: 30       # 30 天
    trace_retention_period: 3                 # 3 天(链路占用空间大)

4. 性能监控指标

// 在应用启动日志中查看 Agent 性能
// 示例输出:
// SkyWalking Agent initialized
// Collector Address: 127.0.0.1:11800
// Sampling Rate: 9/3s
// Instance Name: order-service-1
// Service Name: order-service
// Namespace: prod

🚨 常见问题与排查

问题 1:链路数据无法上传

症状: SkyWalking UI 中看不到服务数据

排查步骤:

# 1. 检查 Agent 是否成功加载
jps -l  # 查看 Java 进程

# 2. 查看 Agent 日志
cat logs/skywalking-agent.log | grep -i "error"

# 3. 验证 OAP 服务是否运行
curl http://127.0.0.1:12800/graphql
# 成功返回 200 和 graphql schema

# 4. 检查网络连接
telnet 127.0.0.1 11800

# 5. 查看应用启动日志
grep -i "skywalking" application.log

问题 2:链路数据丢失

原因: 采样率过低或链路超时

# 调整配置
agent:
  sample_n_per_3_secs: 30              # 提高采样率
  trace_limit_per_segment: 1000        # 增加 Span 数量限制
  
storage:
  trace_retention_period: 7            # 延长保留期

问题 3:性能下降

症状: 集成 SkyWalking 后应用响应变慢

优化方案:

# 1. 降低采样率
agent.sample_n_per_3_secs=5            # 从 9 降到 5

# 2. 关闭不必要的插件
agent.default_transformers_based_on_files=

# 3. 异步发送数据
agent.transport_type=grpc              # 使用 gRPC 替代 HTTP

# 4. 增加 Agent 线程池
agent.trace_dispatch_worker_threads=10

🎓 完整实战示例:电商订单系统

项目结构

order-system/
├── pom.xml
├── application.yml
├── src/main/java/com/example/order/
│   ├── controller/
│   │   └── OrderController.java         ← HTTP 入口点
│   ├── service/
│   │   ├── OrderService.java            ← 业务服务
│   │   ├── InventoryService.java        ← 库存调用
│   │   └── PaymentService.java          ← 支付调用
│   └── repository/
│       └── OrderRepository.java         ← 数据库操作
└── logs/
    └── application.log

完整代码示例

// OrderController.java - HTTP 入口
@RestController
@RequestMapping("/api/orders")
@Slf4j
public class OrderController {
    
    @Autowired
    private OrderService orderService;
    
    @PostMapping
    public ResponseEntity<OrderDTO> createOrder(@RequestBody CreateOrderRequest request) {
        // ✅ SkyWalking 自动记录:
        // - HTTP 请求入口 (Entry Span)
        // - 请求参数
        // - 响应时间
        // - HTTP 状态码
        
        log.info("Creating order, traceId: {}", TraceContext.traceId());
        OrderDTO order = orderService.create(request);
        return ResponseEntity.ok(order);
    }
}

// OrderService.java - 业务逻辑
@Service
@Slf4j
public class OrderService {
    
    @Autowired
    private RestTemplate restTemplate;
    @Autowired
    private OrderRepository orderRepository;
    @Autowired
    private PaymentService paymentService;
    
    @Trace  // ✅ 自定义埋点
    public OrderDTO create(CreateOrderRequest request) {
        // ✅ SkyWalking 自动记录此方法的执行时间和异常
        
        log.info("Order service processing, traceId: {}", TraceContext.traceId());
        
        // 1. 调用库存服务(HTTP 调用自动追踪)
        ResponseEntity<InventoryResponse> inventoryResp = restTemplate.exchange(
            "http://inventory-service/api/inventory/check",
            HttpMethod.POST,
            new HttpEntity<>(request),
            InventoryResponse.class
        );
        
        if (!inventoryResp.getBody().isAvailable()) {
            throw new BusinessException("库存不足");
        }
        
        // 2. 处理支付(跨服务调用自动追踪)
        paymentService.processPayment(request.getPaymentInfo());
        
        // 3. 保存订单到数据库(JDBC 操作自动追踪)
        Order order = new Order();
        order.setCustomerId(request.getCustomerId());
        order.setProductId(request.getProductId());
        order.setStatus(OrderStatus.PENDING);
        
        Order savedOrder = orderRepository.save(order);
        
        return new OrderDTO(savedOrder);
    }
}

// PaymentService.java - 支付服务
@Service
@Slf4j
public class PaymentService {
    
    @Autowired
    private PaymentGateway paymentGateway;
    
    public void processPayment(PaymentInfo paymentInfo) {
        // ✅ 自动追踪:调用第三方支付网关
        log.info("Processing payment, traceId: {}", TraceContext.traceId());
        
        PaymentResult result = paymentGateway.charge(paymentInfo);
        if (!result.isSuccess()) {
            throw new PaymentException("Payment failed: " + result.getMessage());
        }
    }
}

运行结果:SkyWalking 中看到的完整链路

┌────────────────────────────────────────────────────────────┐
│              HTTP POST /api/orders                         │
│              (Entry Span - 顶层调用)                       │
│              总耗时: 543ms                                 │
└────────────────────────┬─────────────────────────────────┘
                         │
     ┌───────────────────┼───────────────────┐
     │                   │                   │
┌────▼────────┐  ┌───────▼──────┐  ┌────────▼───┐
│InventoryAPI │  │PaymentService│  │OrderService│
│HTTP调用      │  │Local Call    │  │DB Insert   │
│128ms        │  │215ms         │  │24ms        │
│✓ 200 OK     │  │✓ Success     │  │✓ Inserted  │
└─────────────┘  └──────────────┘  └────────────┘

📈 与其他可观测性工具集成

1. SkyWalking + Prometheus 指标

# OAP 配置启用 Prometheus exporter
prometheus:
  enabled: true
  port: 1234

# Prometheus 采集配置
scrape_configs:
  - job_name: 'skywalking-oap'
    static_configs:
      - targets: ['127.0.0.1:1234']

2. SkyWalking + ELK 日志关联

// 日志中包含 Trace ID,便于在 ELK 中检索
@Slf4j
public class OrderService {
    
    public void create(Order order) {
        String traceId = TraceContext.traceId();
        
        // ✅ 日志中包含 traceId,可与链路追踪关联
        LOGGER.info("Creating order [traceId: {}]", traceId);
    }
}

// ELK 中检索:
// Kibana -> Query: traceId: "f8f9c1d2e3a4b5c6d7e8f9"
// 可看到此链路相关的所有日志

3. SkyWalking 告警 → 钉钉/企业微信

# OAP 配置 Webhook
alert:
  webhooks:
    - hook_url: http://your-company-webhook/alerts
      method: POST
      headers:
        Authorization: "Bearer token"

🎯 最佳实践总结

✅ DO(应该做)

  • 使用 Java Agent 部署,减少入侵
  • 合理设置采样率,平衡性能和数据完整性
  • 将 Trace ID 关联到日志,便于问题排查
  • 设置告警规则,及时发现问题
  • 定期查看链路数据,发现性能瓶颈
  • 在关键业务场景使用 @Trace 注解

❌ DON'T(不应该做)

  • 生产环境采用 100% 采样率 — 系统开销过大
  • 保留所有历史链路数据 — 存储成本高,应设置合理 TTL
  • 忽视告警规则配置 — 无法及时发现问题
  • 在非关键路径过度埋点 — 增加复杂度和性能开销

🔗 资源链接

资源链接
SkyWalking 官网https://skywalking.apache.org
GitHubhttps://github.com/apache/skywalking
Java Agent 下载https://archive.apache.org/dist/skywalking/
文档https://skywalking.apache.org/docs/
社区讨论https://github.com/apache/skywalking/discussions

🎓 总结

SkyWalking 是微服务架构中必不可少的分布式链路追踪工具:

  1. 自动追踪:零入侵,通过 Java Agent 自动捕获调用链路
  2. 完整可视化:从服务拓扑到具体 Span 的详细信息
  3. 性能分析:快速定位系统瓶颈和故障点
  4. 告警告知:异常情况实时告警,及时应对

结合 ELK Stack(日志) + Prometheus + Grafana(指标) + SkyWalking(链路),我们能实现完整的微服务可观测性体系,这是构建高可用、高性能分布式系统的基础。

下期预告:《Spring Boot 3.x 集成 OpenTelemetry:迁移至云原生可观测性标准》 🚀

0

评论区