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