当前位置: 首页 > news >正文

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

目录

    • 一、实战项目架构(电商下单系统)
    • 二、环境搭建(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.0ports: ["11800:11800", "12800:12800"]skywalking-ui:image: apache/skywalking-ui:9.4.0ports: ["8080:8080"]environment:SW_OAP_ADDRESS: "skywalking-oap:12800"prometheus:image: prom/prometheusports: ["9090:9090"]volumes: ["./prometheus.yml:/etc/prometheus/prometheus.yml"]grafana:image: grafana/grafanaports: ["3000:3000"]# 中间件redis:image: redis:6.2ports: ["6379:6379"]rabbitmq:image: rabbitmq:3.9-managementports: ["5672:5672", "15672:15672"]mysql:image: mysql:8.0ports: ["3306:3306"]environment:MYSQL_ROOT_PASSWORD: "root"# 应用服务order-service:build: ./order-serviceenvironment:SW_AGENT_NAME: "order-service"SW_AGENT_COLLECTOR_BACKEND_SERVICES: "skywalking-oap:11800"ports: ["8081:8080"]inventory-service:build: ./inventory-serviceenvironment: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">200</intProp><intProp name="ThreadGroup.ramp_time">60</intProp>
</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">false</boolProp><stringProp name="Argument.value">{ "productId": 1001, "quantity": 1, "amount": 299 }</stringProp><stringProp name="Argument.metadata">=</stringProp></elementProp></collectionProp></elementProp><stringProp name="HTTPSampler.domain">localhost</stringProp><stringProp name="HTTPSampler.port">8080</stringProp><stringProp name="HTTPSampler.protocol">http</stringProp><stringProp name="HTTPSampler.path">/orders</stringProp><stringProp name="HTTPSampler.method">POST</stringProp>
</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. 优化效果验证

指标优化前优化后提升
TPS120320166%
P99响应时间1200ms350ms70.8%↓
错误率8.5%0.2%97.6%↓

八、全链路监控看板

Grafana监控大盘配置

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

核心面板

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

九、学习路径建议

两周速成计划

时间学习内容产出物
Day 1Docker环境搭建与Compose使用本地监控环境
Day 2SkyWalking基础集成可观测的Spring Boot应用
Day 3中间件监控配置Redis/MySQL监控面板
Day 4JMeter压测脚本编写下单接口压测脚本
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最佳实践
http://www.lryc.cn/news/602065.html

相关文章:

  • Jenkins + SonarQube 从原理到实战一:基于 K8s 部署与使用(含中文插件与 Python 扫描)
  • 力扣1457. 二叉树中的伪回文路径
  • 力扣面试150(42/150)
  • 旧物回收小程序:科技赋能,让旧物回收焕发生机
  • 软件测试之功能测试
  • 6种将iPhone照片传输到Windows 10电脑的方法
  • 跨境协作系统文化适配:多语言环境下的业务符号隐喻与交互习惯
  • 快速了解MySQL
  • Ubuntu lamp
  • 分布式IO选型指南:2025年分布式无线远程IO品牌及采集控制方案详解
  • 四、计算机组成原理——第3章:存储系统
  • 低速信号设计之 SMBUS 篇
  • Power Query概述及导入多源数据方法
  • 从fork到exit:剖析Linux进程的诞生、消亡机制
  • C盘清理大赛技术指南
  • 凸优化:凸函数的一些常用性质
  • 动/静态库的原理及制作
  • 开源B端生态掘金:从Odoo二次开发到行业专属模块的技术变现
  • Qwen 系列模型实现文本改写工具
  • Java 大视界 -- 基于 Java 的大数据实时流处理在智能电网分布式能源接入与电网稳定性保障中的应用(368)
  • Java从入门到精通!第十八天(JDK17安装以及网络编程) 完结篇!!!
  • WPF,窗口拖动事件与窗口内控件点击事件
  • Visual Studio Code使用
  • MCP资源管理深度实践:动态数据源集成方案
  • Jenkins vs GitLab CI/CD vs GitHub Actions在容器化部署流水线中的对比分析与实践指南
  • Spring Boot 2整合Druid的两种方式
  • Spring Boot日志开发实战手册:集成/输出/级别控制/持久化精要
  • docker排查OOM
  • c++ 中的字符串相关的操作
  • 「源力觉醒 创作者计划」_文心大模型4.5系列开源模型,意味着什么?对开发者、对行业生态有何影响?