Skip to content

第 9 章 · 综合实战案例

生活类比:学完理论,来看几家「店」怎么在实战中布置柜台、应对客流高峰、处理收银员请假——每个案例都是真实架构的简化版。


9.1 案例一:个人博客 → 小型 Web 应用

初始状态

用户 ──► 单机 Nginx + PHP ──► MySQL

日 PV 1 万,够用。

流量上涨后

                    ┌──► CVM1: Nginx + PHP
用户 ──► 云 CLB ────┼──► CVM2: Nginx + PHP
                    └──► CVM3: Nginx + PHP


                         云数据库 MySQL
决策选择原因
入口云 CLB 七层免运维、HTTPS 证书托管
算法轮询PHP 实例同质
SessionRedis避免 IP Hash
静态资源CLB 分流到 COS/CDN减轻应用机压力

关键配置思路

  • CLB 健康检查 GET /healthz 每 5s
  • 应用 Session 存 Redis,PHP session.save_handler = redis
  • 上传静态文件到 CDN,Nginx 只反代动态 API

9.2 案例二:电商大促(秒杀场景)

挑战

  • 平时 QPS 500,大促瞬间 5 万
  • 下单接口不能重复扣款
  • 库存不能超卖

架构(简化)

用户 ──► CDN(静态页)

      └──► WAF + 云 LB


           API 网关(APISIX)
           ├── 限流:每用户 10 QPS
           ├── 鉴权:JWT
           └── 路由

       ┌────────┼────────┐
       ▼        ▼        ▼
   订单服务   库存服务   支付服务
   (20 Pod)  (10 Pod)  (5 Pod)

负载均衡相关决策

做法
入口云 LB + API 网关双层
算法least_conn(下单耗时差异大)
重试订单 POST 禁止 LB 重试;业务幂等键
扩容K8s HPA 按 CPU/QPS 自动加 Pod
预热大促前 30 分钟逐步加压,JVM warmup

生活例子

秒杀像 限量款发售——门口保安限流(网关限流),多个收银台但 同一订单号只能结一次(幂等),临时加开柜台(HPA)。


9.3 案例三:微服务 + 内部 RPC

拓扑

                    ┌── order-svc (3 实例)
gateway ──L7───────┼── user-svc  (5 实例)
                    └── pay-svc   (2 实例)

order-svc ──gRPC──► user-svc
          (客户端 LB + 服务注册中心 Nacos/Consul)

两层 LB

层级组件算法
南北向(外→内)Ingress / API 网关路径路由 + least_conn
东西向(服务间)gRPC client LBround_robin 或 pick_first

要点

  • 外部流量 不过度重试 POST
  • 内部 RPC 配置 超时 + 熔断(resilience4j / envoy)
  • 服务注册中心实时更新实例列表,避免打到已下线 Pod

9.4 案例四:多机房容灾

        [DNS Geo + 全局 LB]
           /              \
    [广州机房]          [上海机房]
    CLB + K8s           CLB + K8s
        │                    │
    同城 Redis            同城 Redis
        │                    │
    广州 MySQL 主 ──复制──► 上海 MySQL 从

负载均衡角色

组件作用
DNS GSLB广州用户解析到广州 VIP
机房 CLB机房内 Pod 负载均衡
故障切换广州机房故障,DNS 切到上海(分钟级)

生活例子:连锁品牌在 天河店浦东店 都有柜台,你 GPS 在广州就去天河,天河装修就去浦东。


9.5 案例五:WebSocket 在线客服

特点

  • 连接建立后 长时间挂在一台
  • 消息要顺序、客服状态要实时
用户 ──WS──► LB(支持 WS)──► 客服服务 Pod
                              (粘性:连接级)

配置要点

nginx
location /chat {
    proxy_pass http://chat_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 3600s;
}
  • LB 要支持 协议升级(Upgrade: websocket)
  • 读超时设长(1 小时+)
  • Pod 下线前 draining:不再接新 WS,旧连接办完

9.6 端到端排查剧本

当用户说「网站时快时慢」,按此顺序查:

1. 云 LB 健康后端数是否正常?
2. 是否某台 Pod CPU/内存飙高(热点)?
3. LB 到后端延迟?长连接开了吗?
4. 是否有重试放大流量?
5. 数据库/Redis 是否拖慢(健康检查能通过但业务慢)?
6. 最近是否发布(readiness/预热问题)?

9.7 动手作业

任选一题完成:

  1. 画架构图:为你熟悉的一个网站(B站、淘宝简化版)标出 LB 在哪一层
  2. 写配置:Nginx upstream 实现 3 后端 + least_conn + keepalive + 被动健康检查
  3. 写方案:一个「抢红包」接口,如何保证幂等、如何限流、用什么 LB 算法
  4. 模拟面试:2 分钟讲「秒杀场景下负载均衡要注意什么」

9.8 一句话总结

没有万能架构,只有场景匹配:博客用云 CLB + 轮询,大促加网关限流 + 幂等,微服务分南北东西向,多机房靠 DNS + 机房 LB。

附录 → 面试题速查 | 术语表