扩容说明
网关组件 gateway 为无状态服务,可根据流量需求进行水平扩展。
水平扩展
网关扩容
网关本身不直接对外暴露端口,而是通过接入层 access 统一接收外部请求后转发。因此扩容网关只需要新增 gateway 实例并指向同一控制台即可:
# 新增 gateway 实例
./gateway --address 0.0.0.0 --port 7002 --console <控制台IP:PORT>所有 gateway 实例从同一控制台拉取配置,行为一致。访问层会自动将请求负载分发到各 gateway 实例。
接入层扩容
当外部请求量超过单台 access 的处理能力时,可部署多台 access 实例:
# access 实例 1
./access --address 0.0.0.0 --port 7080 --console <控制台IP:PORT>
# access 实例 2
./access --address 0.0.0.0 --port 7080 --console <控制台IP:PORT>多台 access 上层需配置负载均衡器(如 DNS LB 或云厂商 LB),将流量分发到各 access 节点。
扩容架构示意
┌─────────────────┐
│ Load Balancing │
└────────┬────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌────────────┐
│ access 1 │ │ access 2 │ │ access N │
└─────┬──────┘ └─────┬──────┘ └─────┬──────┘
│ │ │
┌─────┴──────┐ ┌─────┴──────┐ ┌─────┴──────┐
│ gateway 1 │ │ gateway 2 │ │ gateway N │
└─────┬──────┘ └─────┬──────┘ └─────┬──────┘
│ │ │
└──────────────┼──────────────┘
│
┌──────┴──────┐
│ Console │
└─────────────┘扩容注意事项
连接数限制
单个 gateway 实例有最大连接数限制(由系统 ulimit 配置决定)。扩容前需关注以下指标:
| 指标 | 说明 |
|---|---|
| HTTP 连接数 | 当前活跃 HTTP 连接,接近上限时需扩容 |
| SSE 连接数 | 长连接场景下需额外关注 |
| CPU 使用率 | 请求处理密集时优先关注 |
| 内存使用率 | 插件或大响应体场景下需关注 |
建议在连接数达到上限的 70% 时触发扩容。
状态管理
gateway 为无状态服务,不存储业务数据:
- 路由、服务、插件等配置从控制台拉取,各实例配置一致
- 请求日志直接写入日志服务,不依赖本地存储
- 监控指标按实例独立统计,控制台汇总展示
因此网关实例可以随时增加或减少,无需数据迁移。
有状态组件限制
控制台 console 和日志服务 logg 为有状态组件,目前仅支持单节点部署。即使扩容网关,控制台仍为单点。
控制台和日志服务即使宕机,也不会影响网关的正常请求代理,仅影响配置变更和日志查询。
接入层与网关的对应关系
access 通过控制台动态发现 gateway 实例列表,将请求均衡转发。新增或移除 gateway 实例后,access 会自动感知无需重启。
扩容流程
1. 确定扩容指标
根据监控数据判断是否达到扩容阈值:
- 网关 HTTP 连接数持续高位
- 请求响应时间增加
- CPU/内存使用率过高
2. 新增节点
在新增服务器上启动 gateway:
./gateway --address 0.0.0.0 --port 7001 --console <控制台IP:PORT>确认启动日志无异常后,新节点自动加入服务。
3. 验证
- 确认控制台仪表盘显示新增节点
- 确认接入层自动识别新节点
- 观察请求错误率无异常
4. 缩减节点
直接停止目标 gateway 进程即可,正在处理的请求会断开,接入层会自动将新请求转发到其他可用节点。
最佳实践
多机房部署
各机房部署独立的 gateway 集群,所有实例连接至同一控制台。接入层根据地理位置将流量调度到最近机房。
资源规划参考
| 场景 | 单节点建议配置 |
|---|---|
| 低流量(<1K QPS) | 1 核 2G |
| 中等流量(1K-10K QPS) | 2 核 4G |
| 高流量(>10K QPS) | 4 核 8G |
实际性能取决于插件复杂度、请求体大小和并发连接数,建议以实际压测为准。
优雅关闭
停止 gateway 时建议发送 SIGTERM 信号,网关会等待正在处理的请求完成后退出:
kill -TERM <gateway_pid>如需强制停止可使用 SIGINT,但可能导致部分请求中断。
