零基础学习性能测试第九章:全链路追踪-项目实操

目录

    • 一、实战项目架构(电商下单系统)
    • 二、环境搭建(30分钟)
      • 1. 使用Docker Compose一键部署
      • 2. 启动命令
    • 三、项目集成SkyWalking
      • 1. Spring Boot项目添加Agent
      • 2. 关键业务代码埋点
    • 四、全链路压测实战
      • 1. JMeter压测脚本配置
      • 2. 执行压测命令
    • 五、全链路追踪分析实战
      • 1. 在SkyWalking中定位瓶颈
      • 2. 真实瓶颈分析案例
    • 六、中间件性能分析
      • 1. Redis性能分析
      • 2. MySQL性能分析
    • 七、性能优化与验证
      • 1. 优化措施实施
      • 2. 优化效果验证
    • 八、全链路监控看板
      • Grafana监控大盘配置
    • 九、学习路径建议
      • 两周速成计划
    • 十、避坑指南
    • 十一、项目实战扩展
      • 1. 复杂场景压测
      • 2. 自动化压测平台
      • 3. 生产环境全链路监控
    • 总结

一、实战项目架构(电商下单系统)

用户
Nginx
网关服务
订单服务
Redis
RabbitMQ
库存服务
MySQL

系统组件

  • 前端:Nginx (负载均衡)
  • 网关:Spring Cloud Gateway
  • 业务服务:Spring Boot (订单/库存)
  • 中间件:Redis (缓存)、RabbitMQ (异步)、MySQL (数据库)
  • 监控:SkyWalking + Prometheus + Grafana

二、环境搭建(30分钟)

1. 使用Docker Compose一键部署

# docker-compose.yml
version: '3.8'
services:
  # 监控系统
  skywalking-oap:
    image: apache/skywalking-oap-server:9.4.0
    ports: ["11800:11800", "12800:12800"]
  
  skywalking-ui:
    image: apache/skywalking-ui:9.4.0
    ports: ["8080:8080"]
    environment:
      SW_OAP_ADDRESS: "skywalking-oap:12800"
  
  prometheus:
    image: prom/prometheus
    ports: ["9090:9090"]
    volumes: ["./prometheus.yml:/etc/prometheus/prometheus.yml"]
  
  grafana:
    image: grafana/grafana
    ports: ["3000:3000"]
  
  # 中间件
  redis:
    image: redis:6.2
    ports: ["6379:6379"]
  
  rabbitmq:
    image: rabbitmq:3.9-management
    ports: ["5672:5672", "15672:15672"]
  
  mysql:
    image: mysql:8.0
    ports: ["3306:3306"]
    environment:
      MYSQL_ROOT_PASSWORD: "root"
  
  # 应用服务
  order-service:
    build: ./order-service
    environment:
      SW_AGENT_NAME: "order-service"
      SW_AGENT_COLLECTOR_BACKEND_SERVICES: "skywalking-oap:11800"
    ports: ["8081:8080"]
  
  inventory-service:
    build: ./inventory-service
    environment:
      SW_AGENT_NAME: "inventory-service"
      SW_AGENT_COLLECTOR_BACKEND_SERVICES: "skywalking-oap:11800"
    ports: ["8082:8080"]

2. 启动命令

# 启动所有服务
docker-compose up -d

# 验证服务状态
docker-compose ps

三、项目集成SkyWalking

1. Spring Boot项目添加Agent

// 启动脚本 start.sh
java -javaagent:/skywalking/agent/skywalking-agent.jar \
  -Dskywalking.agent.service_name=${SW_AGENT_NAME} \
  -Dskywalking.collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES} \
  -jar app.jar

2. 关键业务代码埋点

// 订单服务下单方法
@PostMapping("/orders")
@Trace // SkyWalking追踪注解
public ResponseEntity<Order> createOrder(@RequestBody OrderRequest request) {
    // 1. 检查库存
    inventoryService.checkStock(request.getProductId(), request.getQuantity());
    
    // 2. 创建订单(记录业务标签)
    ActiveSpan.tag("order.amount", String.valueOf(request.getAmount()));
    
    // 3. 扣减库存(异步消息)
    rabbitTemplate.convertAndSend("stock.deduction", request);
    
    return ResponseEntity.ok(new Order(UUID.randomUUID().toString()));
}

四、全链路压测实战

1. JMeter压测脚本配置


<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="下单压力测试">
  <intProp name="ThreadGroup.num_threads">200intProp>
  <intProp name="ThreadGroup.ramp_time">60intProp>
ThreadGroup>

<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="创建订单">
  <elementProp name="HTTPsampler.Arguments" elementType="Arguments">
    <collectionProp name="Arguments.arguments">
      <elementProp name="" elementType="HTTPArgument">
        <boolProp name="HTTPArgument.always_encode">falseboolProp>
        <stringProp name="Argument.value">{ "productId": 1001, "quantity": 1, "amount": 299 }stringProp>
        <stringProp name="Argument.metadata">=stringProp>
      elementProp>
    collectionProp>
  elementProp>
  <stringProp name="HTTPSampler.domain">localhoststringProp>
  <stringProp name="HTTPSampler.port">8080stringProp>
  <stringProp name="HTTPSampler.protocol">httpstringProp>
  <stringProp name="HTTPSampler.path">/ordersstringProp>
  <stringProp name="HTTPSampler.method">POSTstringProp>
HTTPSamplerProxy>

2. 执行压测命令

jmeter -n -t order_test.jmx -l results.jtl

五、全链路追踪分析实战

1. 在SkyWalking中定位瓶颈

网关延迟高
订单服务慢
库存服务慢
Redis操作慢
MQ发送慢
UPDATE阻塞
SELECT慢
发现慢请求
查看Trace详情
检查Nginx配置
分析业务代码
检查数据库
具体方法
检查Redis性能
检查RabbitMQ
SQL分析
检查行锁
优化索引

2. 真实瓶颈分析案例

现象:下单接口P99=1200ms,SkyWalking显示库存服务耗时占比65%

排查步骤

  1. 在Trace详情中查看库存服务操作:

    inventory-service:
    - checkStock (320ms)
    - deductStock (680ms)
    
  2. 分析deductStock方法:

    // 库存扣减方法
    @Trace
    public void deductStock(String productId, int quantity) {
        // 1. 查询当前库存
        Integer stock = jdbcTemplate.queryForObject(
            "SELECT stock FROM inventory WHERE product_id = ?", 
            Integer.class, productId);
        
        // 2. 扣减库存
        if (stock >= quantity) {
            jdbcTemplate.update(
                "UPDATE inventory SET stock = stock - ? WHERE product_id = ?", 
                quantity, productId);
        }
    }
    
  3. 发现问题:

    • 先SELECT再UPDATE导致并发竞争
    • 未使用事务,存在超卖风险

优化方案

-- 优化为原子操作
UPDATE inventory 
SET stock = stock - ? 
WHERE product_id = ? AND stock >= ?

六、中间件性能分析

1. Redis性能分析

# 连接Redis
docker exec -it redis redis-cli

# 查看关键指标
> info stats
instantaneous_ops_per_sec: 85000  # 当前OPS
keyspace_hits: 1200000
keyspace_misses: 35000

> info memory
used_memory: 1.2gb
used_memory_peak: 1.5gb

优化建议

  • 内存使用>80%时考虑扩容
  • 命中率<95%需优化缓存策略

2. MySQL性能分析

-- 查看慢查询
SELECT * FROM mysql.slow_log 
WHERE query_time > 1;

-- 分析锁等待
SELECT * FROM information_schema.INNODB_LOCKS;

优化建议

  • 为WHERE条件字段添加索引
  • 避免全表更新,使用LIMIT分批

七、性能优化与验证

1. 优化措施实施

// 优化后的库存扣减方法
@Trace
public boolean deductStock(String productId, int quantity) {
    int updated = jdbcTemplate.update(
        "UPDATE inventory SET stock = stock - ? " +
        "WHERE product_id = ? AND stock >= ?",
        quantity, productId, quantity
    );
    return updated > 0;
}

2. 优化效果验证

指标 优化前 优化后 提升
TPS 120 320 166%
P99响应时间 1200ms 350ms 70.8%↓
错误率 8.5% 0.2% 97.6%↓

八、全链路监控看板

Grafana监控大盘配置

链路数据
指标数据
SkyWalking
服务拓扑
Prometheus
中间件监控
全局仪表盘

核心面板

  1. 服务拓扑图 - 展示服务间调用关系
  2. 请求响应时间 - P50/P90/P99
  3. 中间件健康度 - Redis/MQ/DB关键指标
  4. JVM监控 - GC次数/堆内存

九、学习路径建议

两周速成计划

时间 学习内容 产出物
Day 1 Docker环境搭建与Compose使用 本地监控环境
Day 2 SkyWalking基础集成 可观测的Spring Boot应用
Day 3 中间件监控配置 Redis/MySQL监控面板
Day 4 JMeter压测脚本编写 下单接口压测脚本
Day 5 首次全链路压测执行 性能基线报告
Day 6 定位首个性能瓶颈 瓶颈分析报告
Day 7 实施优化方案 优化代码
Day 8 优化效果验证 优化前后对比报告
Day 9 告警配置 异常检测规则
Day 10 项目总结与报告 完整性能测试报告

十、避坑指南

  1. 版本兼容问题

    • SkyWalking Agent版本需与OAP版本匹配
    • Spring Boot版本与SkyWalking插件兼容
  2. 资源限制

    # Docker Compose资源限制
    services:
      order-service:
        deploy:
          resources:
            limits:
              cpus: '1.0'
              memory: 1G
    
  3. 压测数据隔离

    -- 使用测试专用数据库
    CREATE DATABASE stress_test;
    
  4. 日志管理

    # 限制日志大小
    docker run --log-driver json-file --log-opt max-size=10m ...
    

十一、项目实战扩展

1. 复杂场景压测

  • 秒杀场景:瞬时万级并发
  • 分布式事务:跨服务数据一致性
  • 容灾测试:模拟中间件宕机

2. 自动化压测平台

JMeter脚本
Jenkins
执行压测
监控系统
生成报告
邮件通知

3. 生产环境全链路监控

  • 采样率调整:生产环境设置1%-5%采样
  • 敏感数据过滤:屏蔽身份证/银行卡号
  • 权限控制:限制监控数据访问权限

总结

通过本实操指南,您已完成:

  1. 全链路监控环境搭建
  2. Spring Boot项目集成SkyWalking
  3. JMeter压测脚本编写与执行
  4. 基于追踪数据的性能瓶颈定位
  5. 优化方案实施与验证
  6. 监控看板配置与报告生成

关键收获

  • 掌握从代码到中间件的全栈性能分析能力
  • 学会通过数据驱动性能优化
  • 构建企业级可观测性体系

下一步建议

  1. 在GitHub上克隆电商demo项目实战
  2. 尝试模拟不同瓶颈场景(数据库锁、Redis阻塞等)
  3. 设计并实现自定义监控看板
  4. 编写自动化压测流水线

资源推荐

  • SkyWalking官方文档
  • JMeter最佳实践

你可能感兴趣的:(性能测试,学习,性能测试,零基础)