负载均衡与限流策略
在构建高性能、高可用系统中,负载均衡与限流是关键组件,常用于流量分发、故障隔离、服务保护。
⚖️ 负载均衡简介
负载均衡用于将客户端请求合理分发到多个服务实例,提高系统吞吐能力与可用性。
✅ 常见策略
策略 | 描述 | 适用场景 |
---|---|---|
轮询(Round Robin) | 顺序分发 | 服务器性能相近 |
最少连接 | 最空闲节点优先 | 请求耗时不一致 |
IP 哈希 | 相同 IP 分配同节 点 | 会话保持 |
权重分配 | 节点按权重接收请求 | 异构集群 |
🔁 Nginx 负载均衡示例
upstream backend {
server backend1.example.com weight=3;
server backend2.example.com weight=2;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
🚧 限流策略介绍
限流用于防止接口被频繁请求导致宕机,保护服务稳定运行。
✅ 常见算法
算法 | 描述 | 特点 |
---|---|---|
固定窗口 | 每窗口周期限 N 次 | 简单实现 |
滑动窗口 | 精准统计多个小时间片 | 精度高 |
令牌桶 | 每次请求需获取令牌 | 应对突发好 |
漏桶 | 固定速率处理 | 稳定输出速率 |
🧪 使用场景举例
场景 | 策略 |
---|---|
API 网关防刷 | IP + 固定窗口 |
高价值接口保护 | JWT 用户限流 |
内网接口保护 | 令 牌桶限流 |
微服务间调用 | 限 QPS 和并发 |
🧑💻 代码与配置示例
✅ Nginx 限流配置
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
server {
location /api/ {
limit_req zone=one burst=20 nodelay;
proxy_pass http://backend;
}
}
✅ Node.js Express 限流中间件
const rateLimit = require("express-rate-limit");
const limiter = rateLimit({
windowMs: 60 * 1000, // 每分钟
max: 100 // 限制每个 IP 最多 100 次请求
});
app.use("/api/", limiter);
✅ Spring Cloud Gateway 限流(基于 Redis)
spring:
cloud:
gateway:
routes:
- id: limit_route
uri: http://localhost:8081
predicates:
- Path=/api/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 5
redis-rate-limiter.burstCapacity: 10
🧠 常见问题与实践
❓ 限流失败提示用户什么?
返回状态码 429 Too Many Requests
,并提示稍后重试。
❓ 每个接口限流策略应相同吗?
建议分级策略,例如登录接口更严、查询接口更宽。
❓ 限流是否能防御 DDoS?
可作为第一道防线,应配合防火墙和 WAF 使用。