当监控面板上QPS曲线如火箭般飙升,瞬间突破百万大关;当服务器集群在洪流中呻吟告警频发——这很可能是你的接口正遭遇恶意刷量攻击。如何在高并发恶意流量下保障核心业务?以下是经过实战检验的防御体系:
1. 边缘拦截:第一道闸门
# Nginx 限流配置 (漏桶算法)
limit_req_zone $binary_remote_addr zone=api_per_ip:10m rate=100r/s;
location /critical_api {
limit_req zone=api_per_ip burst=50 nodelay;
proxy_pass http://backend;
}
2. 业务层精准防控
// 基于Guava的令牌桶实现
RateLimiter limiter = RateLimiter.create(5000); // 全局5000QPS
@PostMapping("/v1/order")
public Response createOrder(@RequestBody OrderRequest req) {
if (!limiter.tryAcquire()) {
throw new RateLimitException();
}
// 业务逻辑
}
-- Redis限流Lua脚本
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = redis.call('incr', key)
if current > limit then
return 0
elseif current == 1 then
redis.call('expire', key, 1)
end
return 1
3. 资源隔离与弹性扩展
# Kubernetes HPA配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: payment-service
minReplicas: 5
maxReplicas: 100
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
维度 | 正常用户 | 攻击流量 |
---|---|---|
请求频率 | 有高低峰波动 | 持续稳定高并发 |
时间分布 | 符合用户作息规律 | 24小时均匀请求 |
设备多样性 | 设备类型/OS版本分散 | 高度统一设备指纹 |
行为路径 | 多页面跳转 | 单接口重复调用 |
当遭遇百万QPS攻击时,单纯扩容可能导致天文数字账单:
# 攻击成本估算(按云服务计费)
攻击流量 = 1,000,000 QPS * 3600秒 = 36亿次/小时
API网关费用 = 36亿次 * $0.015/万次 = $5,400/小时
此时应优先启用:
血泪经验:某电商平台曾因未做业务层限流,在遭受80万QPS攻击时,虽然Nginx扛住了流量,但下游订单服务DB连接池耗尽,导致正常交易瘫痪2小时。
防御百万QPS攻击没有银弹,唯有构建从边缘到数据层的立体防护体系。每一次攻防对抗都在重塑系统架构——这正是技术人面临的挑战与魅力所在。