目录
-
- 一、实战项目架构(电商下单系统)
- 二、环境搭建(30分钟)
-
- [1. 使用Docker Compose一键部署](#1. 使用Docker Compose一键部署)
- [2. 启动命令](#2. 启动命令)
- 三、项目集成SkyWalking
-
- [1. Spring Boot项目添加Agent](#1. Spring Boot项目添加Agent)
- [2. 关键业务代码埋点](#2. 关键业务代码埋点)
- 四、全链路压测实战
-
- [1. JMeter压测脚本配置](#1. JMeter压测脚本配置)
- [2. 执行压测命令](#2. 执行压测命令)
- 五、全链路追踪分析实战
-
- [1. 在SkyWalking中定位瓶颈](#1. 在SkyWalking中定位瓶颈)
- [2. 真实瓶颈分析案例](#2. 真实瓶颈分析案例)
- 六、中间件性能分析
-
- [1. Redis性能分析](#1. Redis性能分析)
- [2. MySQL性能分析](#2. MySQL性能分析)
- 七、性能优化与验证
-
- [1. 优化措施实施](#1. 优化措施实施)
- [2. 优化效果验证](#2. 优化效果验证)
- 八、全链路监控看板
- 九、学习路径建议
- 十、避坑指南
- 十一、项目实战扩展
-
- [1. 复杂场景压测](#1. 复杂场景压测)
- [2. 自动化压测平台](#2. 自动化压测平台)
- [3. 生产环境全链路监控](#3. 生产环境全链路监控)
- 总结
一、实战项目架构(电商下单系统)
用户 Nginx 网关服务 订单服务 Redis RabbitMQ 库存服务 MySQL
系统组件:
- 前端:Nginx (负载均衡)
- 网关:Spring Cloud Gateway
- 业务服务:Spring Boot (订单/库存)
- 中间件:Redis (缓存)、RabbitMQ (异步)、MySQL (数据库)
- 监控:SkyWalking + Prometheus + Grafana
二、环境搭建(30分钟)
1. 使用Docker Compose一键部署
yaml
# 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. 启动命令
bash
# 启动所有服务
docker-compose up -d
# 验证服务状态
docker-compose ps
三、项目集成SkyWalking
1. Spring Boot项目添加Agent
java
// 启动脚本 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. 关键业务代码埋点
java
// 订单服务下单方法
@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压测脚本配置
xml
<!-- 下单接口压测 -->
<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. 执行压测命令
bash
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%
排查步骤:
-
在Trace详情中查看库存服务操作:
inventory-service: - checkStock (320ms) - deductStock (680ms)
-
分析deductStock方法:
java// 库存扣减方法 @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); } }
-
发现问题:
- 先SELECT再UPDATE导致并发竞争
- 未使用事务,存在超卖风险
优化方案:
sql
-- 优化为原子操作
UPDATE inventory
SET stock = stock - ?
WHERE product_id = ? AND stock >= ?
六、中间件性能分析
1. Redis性能分析
bash
# 连接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性能分析
sql
-- 查看慢查询
SELECT * FROM mysql.slow_log
WHERE query_time > 1;
-- 分析锁等待
SELECT * FROM information_schema.INNODB_LOCKS;
优化建议:
- 为WHERE条件字段添加索引
- 避免全表更新,使用LIMIT分批
七、性能优化与验证
1. 优化措施实施
java
// 优化后的库存扣减方法
@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 中间件监控 全局仪表盘
核心面板:
- 服务拓扑图 - 展示服务间调用关系
- 请求响应时间 - P50/P90/P99
- 中间件健康度 - Redis/MQ/DB关键指标
- 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 | 项目总结与报告 | 完整性能测试报告 |
十、避坑指南
-
版本兼容问题:
- SkyWalking Agent版本需与OAP版本匹配
- Spring Boot版本与SkyWalking插件兼容
-
资源限制:
yaml# Docker Compose资源限制 services: order-service: deploy: resources: limits: cpus: '1.0' memory: 1G
-
压测数据隔离:
sql-- 使用测试专用数据库 CREATE DATABASE stress_test;
-
日志管理:
bash# 限制日志大小 docker run --log-driver json-file --log-opt max-size=10m ...
十一、项目实战扩展
1. 复杂场景压测
- 秒杀场景:瞬时万级并发
- 分布式事务:跨服务数据一致性
- 容灾测试:模拟中间件宕机
2. 自动化压测平台
JMeter脚本 Jenkins 执行压测 监控系统 生成报告 邮件通知
3. 生产环境全链路监控
- 采样率调整:生产环境设置1%-5%采样
- 敏感数据过滤:屏蔽身份证/银行卡号
- 权限控制:限制监控数据访问权限
总结
通过本实操指南,您已完成:
- 全链路监控环境搭建
- Spring Boot项目集成SkyWalking
- JMeter压测脚本编写与执行
- 基于追踪数据的性能瓶颈定位
- 优化方案实施与验证
- 监控看板配置与报告生成
关键收获:
- 掌握从代码到中间件的全栈性能分析能力
- 学会通过数据驱动性能优化
- 构建企业级可观测性体系
下一步建议:
- 在GitHub上克隆电商demo项目实战
- 尝试模拟不同瓶颈场景(数据库锁、Redis阻塞等)
- 设计并实现自定义监控看板
- 编写自动化压测流水线
资源推荐: