30分钟课程:秒杀系统性能优化实战(CDN + Nginx + Sentinel)
课程目标
- 掌握静态资源 CDN 加速的配置与优化策略。
- 通过 Nginx 实现负载均衡,提升系统横向扩展能力。
- 使用 Sentinel 实现服务降级,保障核心链路稳定性。
课程内容与时间分配
0~5分钟:课程概述
业务场景与挑战
- 高并发压力:瞬时流量导致服务器过载、响应延迟。
- 资源瓶颈:静态资源带宽耗尽、服务线程池被打满。
- 核心优化目标:
- 加速静态资源:通过 CDN 减少服务器负载。
- 流量分发:Nginx 负载均衡分散请求压力。
- 服务自保:Sentinel 熔断非核心功能,确保订单主链路可用。
技术选型
- CDN:阿里云/腾讯云对象存储 + CDN 加速。
- Nginx:轮询、加权、IP Hash 等负载策略。
- Sentinel:QPS 限流、熔断降级规则。
5~10分钟:技术难点与核心问题
- CDN 缓存更新
- 如何实现静态资源实时更新与版本控制?
- 负载均衡策略选择
- 如何根据服务器性能动态分配权重?
- 服务降级精细化
- 如何区分核心接口(下单)与非核心接口(商品详情)?
- 监控与动态调整
- 如何实时感知系统压力并调整降级策略?
10~25分钟:解决方案与代码实战
1. 静态资源CDN加速(10~15分钟)
配置步骤
- 将静态资源(JS/CSS/图片)上传至云存储(如阿里云 OSS)。
- 绑定 CDN 域名并开启 HTTPS 和缓存压缩。
HTML 资源引用示例
<!-- 原始本地资源 -->
<script src="/static/js/seckill.js"></script>
<!-- CDN 加速后 -->
<script src="https://cdn.yourdomain.com/static/js/seckill_v1.2.js"></script>
版本控制策略
- 文件名添加哈希后缀(如
seckill_v1.2.js
),通过 CI/CD 自动更新。
2. Nginx负载均衡(15~20分钟)
Nginx 配置示例
http {
upstream backend_servers {
# 轮询策略(可替换为 ip_hash、weight 等)
server 192.168.1.101:8080 weight=3; # 权重3
server 192.168.1.102:8080;
server 192.168.1.103:8080 backup; # 备用服务器
}
server {
listen 80;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态资源直接由 Nginx 缓存
location /static/ {
expires 7d;
access_log off;
alias /data/static/;
}
}
}
关键指令
weight
:服务器权重。backup
:备用服务器(仅当主服务器不可用时启用)。expires
:静态资源缓存时间。
3. Sentinel服务降级(20~25分钟)
依赖配置(Spring Cloud Alibaba)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
核心接口限流与降级
@RestController
public class OrderController {
// 定义资源(每秒限流 1000 QPS,降级策略:直接拒绝)
@SentinelResource(
value = "createOrder",
blockHandler = "createOrderBlockHandler",
fallback = "createOrderFallback"
)
@PostMapping("/order")
public String createOrder(@RequestBody OrderRequest request) {
// 业务逻辑:扣减库存、生成订单
return "订单创建成功";
}
// 限流/降级处理逻辑
public String createOrderBlockHandler(OrderRequest request, BlockException ex) {
return "系统繁忙,请稍后再试";
}
// 异常降级处理
public String createOrderFallback(OrderRequest request, Throwable ex) {
return "服务暂时不可用";
}
}
Sentinel 控制台规则配置
// 动态规则(QPS 限流)
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("createOrder");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(1000); // 阈值
rules.add(rule);
FlowRuleManager.loadRules(rules);
25~30分钟:练习与拓展
练习题目
- Nginx健康检查配置
- 要求:为后端服务器添加主动健康检查(间隔5秒,失败3次标记为不可用)。
- Sentinel热点参数限流
- 任务:针对商品ID实施热点限流(如商品A每秒最多100次请求)。
推荐拓展方向
- 全链路压测
- 使用 JMeter 模拟秒杀流量,验证 CDN + Nginx + Sentinel 的整体性能。
- 自动弹性扩缩容
- 结合 Kubernetes 或云服务(如阿里云弹性伸缩),动态调整服务器数量。
- 多级缓存设计
- 本地缓存(Caffeine) + Redis 减少数据库压力。
课程总结
- CDN 核心价值:分担带宽压力,提升静态资源加载速度。
- Nginx 负载均衡:通过多策略分发请求,提升系统吞吐量。
- Sentinel 降级:精准控制流量,防止雪崩效应。
- 关键配置:
- CDN 版本化静态资源引用。
- Nginx 加权轮询与缓存配置。
- Sentinel 资源定义与规则动态加载。
课后资源
- Nginx 官方文档:Nginx Load Balancing
- Sentinel GitHub:Alibaba Sentinel
- 完整代码示例:GitHub - 秒杀性能优化Demo