Express 中实现负载均衡和高可用性
在 Express 中实现负载均衡和高可用性通常需要结合架构设计和外部工具,以下是常见方法及步骤:
一、负载均衡实现方案
1. 使用 Node.js 集群模式(Cluster Module)
- 原理:利用多核 CPU,创建多个进程处理请求。
- 实现:
javascript
const cluster = require('cluster');
const os = require('os');
const express = require('express');
if (cluster.isMaster) {
const numCPUs = os.cpus().length;
for (let i = 0; i < numCPUs; i++) {
cluster.fork(); // 创建工作进程
}
cluster.on('exit', (worker) => {
console.log(`Worker ${worker.process.pid} died, restarting...`);
cluster.fork(); // 自动重启崩溃的进程
});
} else {
const app = express();
app.get('/', (req, res) => res.send('Hello from Worker!'));
app.listen(3000);
}
- 工具优化:使用 PM2 简化集群管理:
bash
pm2 start app.js -i max # 自动根据 CPU 核心数启动集群
pm2 save # 保存配置
pm2 startup # 设置开机自启(提升可用性)
2. 反向代理负载均衡
- 使用 Nginx:
nginx
http {
upstream express_servers {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 192.168.1.2:3000; # 另一台服务器的实例
least_conn; # 负载均衡策略(如轮询、加权等)
}
server {
listen 80;
location / {
proxy_pass http://express_servers;
proxy_set_header Host $host;
}
}
}
1. 部署多个 Express 实例(不同端口或不同服务器)。
2. 配置 Nginx 作为反向代理:
- 其他工具:HAProxy、Traefik 等。
3. 容器化与编排(Kubernetes)
- 将 Express 应用 Docker 化,通过 Kubernetes 自动调度和管理容器副本。
- 示例 Kubernetes 部署配置:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: express-app
spec:
replicas: 3 # 启动 3 个副本
selector:
matchLabels:
app: express
template:
metadata:
labels:
app: express
spec:
containers:
- name: express
image: your-docker-image
ports:
- containerPort: 3000
二、高可用性(HA)策略
1. 多实例部署
- 在不同服务器或可用区(云环境)部署多个 Express 实例,避免单点故障。
2. 健康检查与自动恢复
- Nginx 健康检查:
nginx
upstream express_servers {
server 127.0.0.1:3000 max_fails=3 fail_timeout=30s;
server 127.0.0.1:3001 max_fails=3 fail_timeout=30s;
check interval=5000 rise=2 fall=3 timeout=1000; # 定期检查后端健康状态
}
- Kubernetes 探针:
yaml
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 15
periodSeconds: 20
readinessProbe:
httpGet:
path: /ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
3. 数据库与外部服务冗余
- 使用主从复制(如 MySQL、PostgreSQL)或分布式数据库(如 MongoDB 分片)。
- 会话管理:使用 Redis 或 Memcached 共享 Session,避免实例间状态不一致。
4. 容灾与故障转移
- 云服务商方案:如 AWS ALB + Auto Scaling Group、Azure Load Balancer 等。
- DNS 故障转移:通过 DNS 服务(如 Route 53)切换流量到备用区域。
三、注意事项
- 无状态设计:确保应用无状态(如使用 JWT 或共享 Session 存储)。
- 日志与监控:集中收集日志(ELK 栈),使用 Prometheus + Grafana 监控性能。
- 压力测试:通过工具(如 Artillery、LoadTest)模拟流量,验证负载均衡效果。
总结
- 开发环境:可使用 PM2 集群模式快速验证。
- 生产环境:建议结合 Nginx/Kubernetes 和云服务,实现全链路高可用。
根据实际业务规模选择合适的方案,小型项目可简化部署,大型系统需考虑多层级冗余和自动化运维。