节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
6.24 KiB
Stardust
# GW 网关管理 - StarGateway 架构 > 版本:v1.0 | 日期:2026-07-15 > 对应模块:GW 网关管理 > 相关文档:[需求文档](/NewLife/Stardust/Blob/master/Doc/需求文档.md) §3.11 | [功能清单](/NewLife/Stardust/Blob/master/Doc/功能清单.md) §GW | [GW-7-网关竞品分析](/NewLife/Stardust/Blob/master/Doc/GW-7-网关竞品分析.md) | [GW-8-网关使用指南](/NewLife/Stardust/Blob/master/Doc/GW-8-网关使用指南.md) --- ### 1. 系统整体架构图 展示 StarGateway、StarAgent 与业务应用之间的拓扑关系与职责划分。 ```mermaid flowchart TD Internet((互联网流量\n*.newlifex.com)) -->|HTTP/HTTPS\n80/443| SG subgraph Server [单台服务器 / 节点] direction TB SG["🛡️ StarGateway\n域名路由 | SSL终结 | WebSocket代理\n负载均衡 | 空闲计时 | 端口探测"] SA["🤖 StarAgent\n系统级服务 | 进程守护\n本地 API: 127.0.0.1"] subgraph Apps [业务应用池 - 按需启停] direction LR AppA[App-A :5001\n🟢 运行中] AppB[App-B :5002\n⚪ 已休眠] AppC[App-C :5003\n🟢 运行中] end end %% 流量转发 SG ==>|直接转发| AppA SG ==>|直接转发| AppC %% 控制与守护 SG <-->|本地 HTTP API\n通知启停 / 状态同步| SA SA -.->|守护/异常拉起| SG SA -.->|启停控制| AppA SA -.->|启停控制| AppB SA -.->|启停控制| AppC %% 样式 classDef gateway fill:#2c3e50,stroke:#3498db,stroke-width:2px,color:#fff; classDef agent fill:#8e44ad,stroke:#9b59b6,stroke-width:2px,color:#fff; classDef appRun fill:#27ae60,stroke:#2ecc71,stroke-width:2px,color:#fff; classDef appSleep fill:#95a5a6,stroke:#bdc3c7,stroke-width:2px,color:#fff,stroke-dasharray:5; class SG gateway; class SA agent; class AppA,AppC appRun; class AppB appSleep; ``` --- ### 2. 请求唤醒流程(冷启动) 展示当应用处于休眠状态时,流量到达后的完整交互时序。 ```mermaid sequenceDiagram actor User as 用户浏览器 participant SG as StarGateway participant SA as StarAgent (本地API) participant App as 目标应用 (App-B) User->>SG: 1. 请求 https://app-b.newlifex.com SG->>SG: 2. 域名路由匹配 -> 目标 :5002 SG->>SG: 3. TCP 探测 :5002 端口 alt 端口已监听 (应用运行中 🟢) SG-->>User: 直接转发请求,返回 200 OK else 端口未监听 (应用已休眠 ⚪) SG-->>User: 4. 返回 503 Service Unavailable (或加载中提示页) SG->>SA: 5. POST /api/start {app: "app-b"} SA->>App: 6. 启动进程 (App-B) SA-->>SG: 7. 返回 202 Accepted (启动中) loop 每秒探测一次 (直至 StartupTimeout) SG->>SG: 8. TCP 探测 :5002 end SG->>SG: 9. 端口就绪,重置空闲计时器 Note over User,SG: 10. 用户刷新或前端自动重试 User->>SG: 11. 重试请求 SG->>App: 12. 转发请求 App-->>User: 13. 返回 200 OK end ``` --- ### 3. 空闲回收流程(自动休眠) 展示应用长时间无流量时的资源回收时序。 ```mermaid sequenceDiagram participant SG as StarGateway participant SA as StarAgent (本地API) participant App as 目标应用 (App-B) Note over SG: App-B 持续无流量访问 SG->>SG: 1. 空闲计时器达到 15 分钟 (可配) SG->>SA: 2. POST /api/stop {app: "app-b"} SA->>App: 3. 发送 SIGTERM (请求优雅关闭) alt 进程在超时前正常退出 App-->>SA: 4a. 进程退出 else 超时未退出 SA->>App: 4b. 发送 SIGKILL (强制杀死) App-->>SA: 5b. 进程退出 end SA-->>SG: 6. 返回 200 OK (已停止) SG->>SG: 7. 标记 App-B 为休眠状态 ⚪ Note over SG,App: 8. 内存释放完成 ♻️ ``` --- ### 4. WebSocket 代理流程(升级握手) 展示客户端通过 HTTP Upgrade 机制建立 WebSocket 长连接的完整交互。 ```mermaid sequenceDiagram actor Client as 客户端 (浏览器/WS客户端) participant SG as StarGateway participant Backend as 后端应用 Client->>SG: 1. HTTP GET /ws Note over Client,SG: Headers: Connection: Upgrade\nUpgrade: websocket\nSec-WebSocket-Key: xxx\nSec-WebSocket-Version: 13 SG->>SG: 2. 路由匹配 -> 目标 :5002 SG->>SG: 3. 检查路由允许 WebSocket ✅ SG->>SG: 4. 首次记录访问日志 + APM Span SG->>Backend: 5. 透传原始 Upgrade 请求 Note over SG,Backend: 保留所有 Sec-WebSocket-* 头部 Backend-->>SG: 6. HTTP 101 Switching Protocols Note over Backend,SG: Headers: Connection: upgrade\nUpgrade: websocket\nSec-WebSocket-Accept: xxx\nSec-WebSocket-Protocol: (可选) SG-->>Client: 7. 透传 101 响应 Note over SG: 标记连接为 "已升级" ✅ Note over SG: 后续帧跳过 HTTP 解析/日志/Span par 双向帧转发 (TCP 透传) Client->>SG: 8a. WebSocket 数据帧 (掩码) SG->>Backend: 8b. 原样转发 (去除掩码由客户端协议处理) Backend-->>SG: 9a. WebSocket 数据帧 SG-->>Client: 9b. 原样转发 end Note over Client,Backend: Ping / Pong / 关闭帧同样透明转发 Client->>SG: 10. Close 帧 SG->>Backend: 11. 透传 Close 帧 Backend-->>SG: 12. Close 帧回应 SG-->>Client: 13. 透传 Close 帧回应 Note over SG: 连接关闭,释放资源 ``` ### 5. 设计亮点总结 1. **TCP 探测解耦**:Gateway 不依赖 Agent 回报状态,直接探测端口,最真实反映应用是否具备服务能力。 2. **503 降级与重试**:冷启动期间不阻塞 Gateway 线程,通过 503 状态码让客户端(或前端 JS)自动重试,体验平滑。 3. **优雅与强制结合**:停止应用时先发 `SIGTERM` 给 .NET 应用处理收尾工作,超时再 `SIGKILL`,保证数据不丢失。 4. **WebSocket 零开销透传**:升级握手完成后,Gateway 在 TCP 层面透明转发帧数据,不解析帧内容、不产生额外日志和 APM Span,对长连接场景零性能影响。 5. **路由级 WebSocket 开关**:每路由可独立控制是否允许 WebSocket 升级,避免非目标路由被利用为 WebSocket 隧道。 6. **仅首次日志规则**:WebSocket 升级请求以外的帧不产生访问日志和链路追踪 Span,大幅降低长连接日志量。