节点在线、应用在线、配置在线使用令牌查询
大石头 authored at 2021-12-16 19:49:30
12.58 KiB
Stardust
# StarGateway 使用指南 > 版本:v2.0 | 日期:2026-07-08 --- ## 1. 概述 StarGateway(星尘网关)是星尘分布式平台的流量网关组件,提供 Nginx 类反向代理能力。它采用**客户端代理**架构——网关实例作为 StarServer 的客户端自动获取配置,无需在每个实例上手工配置。 ### 核心特性 | 特性 | 说明 | 状态 | |------|------|:----:| | **动态路由** | 域名/路径/请求头/方法匹配,支持通配符 | ✅ | | **负载均衡** | 轮询/最少连接/IP Hash | ✅ | | **TLS 终止** | HTTPS 入站解密,支持 PEM/PFX 多格式证书 | ✅ | | **WebSocket 代理** | 透明帧转发,路由级开关,仅首次日志 | ✅ | | **健康检查** | TCP 端口主动探测,自动摘除不健康节点 | ✅ | | **配置热更新** | 配置变更实时生效,零中断 | ✅ | | **StarAgent 协同** | 冷启动唤醒应用,空闲自动回收 | ✅ | | **星尘 APM 集成** | 每次转发创建追踪 Span,完整链路追踪 | ✅ | | **证书统一管理** | 复用星尘部署中心 SslCertificate,支持自动续期 | ✅ | | **StarServer 注册** | 作为 AppClient 注册到 StarServer,在线可见 | ✅ | ### 架构位置 ``` 客户端 (HTTP/HTTPS/WebSocket) │ ▼ ┌─────────────────────────────────┐ │ StarGateway (:8800) │ │ ┌───────────────────────────┐ │ │ │ HttpReverseProxy │ │ │ │ ├── 路由匹配 │ │ │ │ ├── 负载均衡 │ │ │ │ ├── TLS 终止 │ │ │ │ ├── 健康检查 │ │ │ │ └── Admin API │ │ │ └───────────────────────────┘ │ │ ↕ │ │ StarFactory (AppClient) │ └────────────┬────────────────────┘ │ ┌────────┴────────┐ ▼ ▼ StarServer StarAgent (配置/注册) (启停/守护) │ │ ▼ ▼ StarWeb 后端应用池 (管理后台) (App-A/B/C) ``` --- ## 2. 安装部署 ### 2.1 前置条件 - .NET 10.0 Runtime - 已部署的 StarServer(星尘服务端) - (可选)已部署的 StarAgent(用于冷启动和空闲回收) ### 2.2 编译发布 ```bash # 克隆仓库 git clone https://github.com/NewLifeX/Stardust.git cd Stardust # 编译 StarGateway dotnet build StarGateway/StarGateway.csproj -c Release # 发布 dotnet publish StarGateway/StarGateway.csproj -c Release -o publish ``` ### 2.3 配置文件 StarGateway 支持多级配置来源(优先级从高到低): 1. 命令行参数(如 `--StarServer=http://...`) 2. 环境变量(`StarServer` / `StarAppId` / `StarSecret`) 3. `appsettings.json` 4. `config/Star.config` 5. 本地 StarAgent(UDP 5500 端口探测) #### appsettings.json ```json { "StarServer": "http://star.newlifex.com:6600", "StarAppId": "StarGateway", "StarSecret": "", "StarGateway": { "Debug": false, "Port": 8800, "LocalConfigFile": "gateway.json", "HealthCheckInterval": 10, "ConfigRefreshInterval": 15, "IdleTimeout": 900 } } ``` #### config/Star.config ``` Server=http://star.newlifex.com:6600 AppKey=StarGateway Secret= Debug=false ``` ### 2.4 配置项说明 | 配置项 | 默认值 | 说明 | |--------|:------:|------| | `StarGateway:Debug` | `true` | 调试模式,开启会话级日志 | | `StarGateway:Port` | `8800` | 监听端口 | | `StarGateway:LocalConfigFile` | `gateway.json` | StarServer 不可达时的本地兜底配置路径 | | `StarGateway:HealthCheckInterval` | `10` | 健康检查间隔(秒) | | `StarGateway:ConfigRefreshInterval` | `15` | 配置刷新间隔(秒) | | `StarGateway:IdleTimeout` | `900` | 后端空闲超时(秒),超过此时间无流量将被回收 | ### 2.5 启动 ```bash # 直接运行 cd publish dotnet StarGateway.dll # 指定端口 dotnet StarGateway.dll --StarGateway:Port=8080 # 指定 StarServer dotnet StarGateway.dll --StarServer=http://192.168.1.100:6600 ``` 启动后日志: ``` Starting...... 正在初始化星尘…… StarGateway 已连接 StarServer: http://192.168.1.100:6600 数据库初始化完成 StarGateway 已启动,监听端口 8800,远程服务器 http://192.168.1.100:6600 Application started. Press Ctrl+C to shut down. ``` --- ## 3. 路由配置 ### 3.1 通过 StarWeb 管理后台 1. 登录 StarWeb(星尘管理后台) 2. 进入 **网关管理** 区域 3. **先创建集群** → 定义后端服务器组(含负载均衡算法、健康检查参数) 4. **在集群中添加节点** → 后端地址(`http://localhost:5000`) 5. **创建路由** → 定义请求匹配规则并关联到集群 ### 3.2 路由匹配规则 | 字段 | 说明 | 示例 | |------|------|------| | **域名 (Domain)** | 精确/通配符/全部 | `app.example.com` / `*.example.com` / `*` | | **路径 (Path)** | 前缀/精确 | `/api/*` / `/api/v1/users` | | **HTTP 方法 (Methods)** | 逗号分隔 | `GET,POST` / `GET` | | **请求头 (Headers)** | JSON 匹配规则 | `{"X-Region": "cn*"}` | | **WebSocket** | 是否允许 WebSocket 升级 | `true` / `false` | | **StripPrefix** | 转发时去除匹配路径前缀 | `/api/users` → `/users` | | **AddHeaders** | 转发时添加的请求头 | `{"X-Proxy": "StarGateway"}` | | **优先级 (Priority)** | 数值越大越优先匹配 | `100` | ### 3.3 路由匹配顺序 每条路由有优先级(`Priority` 字段),数值越大越优先匹配。匹配顺序: 1. **域名匹配**:精确 → `*.example.com` 通配符 → `*` 全部 2. **路径匹配**:精确 → 前缀 `/api/*` 3. **HTTP 方法匹配**:指定方法 → 全部 4. **请求头匹配**:所有指定 Headers 全部匹配 ### 3.4 负载均衡算法 | 算法 | 说明 | 适用场景 | |------|------|----------| | **RoundRobin** | 轮询选择后端节点 | 通用场景,节点性能均匀 | | **LeastConnection** | 选择当前活跃连接数最少的节点 | 请求处理时间差异大 | | **IPHash** | 根据客户端 IP 哈希选择节点 | 需要会话保持 | ### 3.5 本地配置文件兜底 当 StarServer 和数据库均不可达时,使用 `gateway.json` 本地兜底: ```json [ { "name": "example-app", "domain": "app.example.com", "path": "/api/*", "target": "http://localhost:5000" } ] ``` --- ## 4. 证书配置 ### 4.1 证书管理入口 StarGateway 的 SSL 证书统一由**星尘部署中心**的 `SslCertificate` 管理。支持: - **PEM 格式**(通用,推荐) - **PFX 格式**(Windows/IIS) - **CRT+KEY 格式**(Linux/Nginx) ### 4.2 配置步骤 1. 登录 StarWeb → **部署管理** → **SSL证书** 2. 新增证书: - 域名:`*.example.com`(支持通配符) - 上传证书文件(PEM / PFX / CRT+KEY) - 设置启用状态 3. 网关启动时自动加载所有启用证书 4. 证书变更后,网关在下次配置刷新周期(默认15秒)自动热加载 ### 4.3 证书与发布中心的关系 StarGateway 不再维护独立的 `GatewayCert` 表,而是**统一使用部署中心的 `SslCertificate`**。这意味着: - 证书只需在部署中心上传一次,网关和发布系统共享使用 - 证书自动续期(Let's Encrypt / 阿里云)后,网关自动获取最新证书 - 支持按域名 SNI 匹配多证书 > **注意**:`GatewayCert` 表已废弃,现有数据建议迁移到 `SslCertificate`。 --- ## 5. StarAgent 协同 ### 5.1 配置前提 确保本机运行 StarAgent,StarGateway 自动通过 `http://127.0.0.1:5500` 与其通信。 ### 5.2 冷启动(应用唤醒) 当请求到达但后端端口未监听时: ``` 1. Gateway → 探测后端端口 → 未监听 2. Gateway → 返回 503 Service Unavailable 3. Gateway → 调用 StarAgent StartService API 4. StarAgent → 启动后端应用进程 5. 应用就绪后 → 后续请求正常转发 ``` ### 5.3 空闲回收 后端持续无流量超过 `IdleTimeout`(默认 900 秒/15 分钟): ``` 1. Gateway → 检测到后端超过 IdleTimeout 无活动 2. Gateway → 调用 StarAgent StopService API 3. StarAgent → 发送 SIGTERM(优雅关闭) 4. 超时未退出 → SIGKILL(强制杀死) 5. 资源释放 ``` --- ## 6. 运行监控 ### 6.1 本地 Admin API StarGateway 内置管理 API(仅限本地访问): ```bash # 运行状态 curl http://127.0.0.1:8800/api/status # 路由列表 curl http://127.0.0.1:8800/api/routes # 手动刷新配置(路由+证书) curl http://127.0.0.1:8800/api/refresh ``` `/api/status` 响应示例: ```json { "uptime": 3600, "activeSessions": 5, "totalRequests": 1024, "routeCount": 8, "port": 8800 } ``` ### 6.2 访问日志 - 每次请求自动记录到 AdminLog - 格式:`{METHOD} {path} -> {target}:{port} [{routeName}]` - WebSocket 仅首次升级记录日志 - 通过 `XTrace.Log` 输出到控制台/文件 ### 6.3 链路追踪 - 每次转发创建 `gateway:{METHOD}:{path}` Span - 自动透传 `Trace-Id` / `traceparent` 请求头 - 可在星尘 APM 中查看完整调用链路 ### 6.4 Prometheus 指标 当前版本暂未暴露 Prometheus 格式指标。可通过 `/api/status` JSON API 由 StarAgent 采集。 --- ## 7. StarServer 对接 ### 7.1 注册到 StarServer 配置 `appsettings.json` 中的 `StarServer` 地址和 `StarAppId`,StarGateway 启动后自动: 1. 创建 `StarFactory` 初始化 `AppClient` 2. 连接到 StarServer 进行登录认证 3. 在 StarServer 的应用管理页面上显示为在线客户端 4. 通过心跳维持连接 ### 7.2 配置加载优先级 ``` 1. StarServer API (GET /gateway/config) — 预留扩展 2. 本地数据库 (XCode ORM) — 当前主要方式 3. 本地配置文件 (gateway.json) — 离线兜底 ``` ### 7.3 StarWeb 管理后台 在 StarWeb 中可以: - **网关管理** → 管理路由、集群、节点 - **部署管理** → 管理 SSL 证书(SslCertificate) - **应用管理** → 查看 StarGateway 在线状态 - **链路追踪** → 查看网关转发的请求链路 --- ## 8. 常见问题 FAQ ### Q: StarGateway 启动后端口被占用? ``` Error: System.Net.Sockets.SocketException (10048): 通常每个套接字地址 (协议/网络地址/端口) 只允许使用一次。 ``` **解决**:修改 `appsettings.json` 中的 `StarGateway:Port`,或关闭占用端口的程序。 ### Q: 路由配置修改后未生效? **原因**:StarGateway 默认每 15 秒从数据库刷新配置。 **解决**: - 等待自动刷新周期 - 调用 `curl http://127.0.0.1:8800/api/refresh` 手动触发 - 减少 `ConfigRefreshInterval` 配置值 ### Q: 后端节点显示不健康? **检查项**: - 确认后端应用已启动并可访问 - 确认网络防火墙允许端口访问 - 健康检查默认 TCP 端口探测,确保端口可连接 - 查看 StarGateway 日志中的健康检查结果 ### Q: 证书加载失败? **检查项**: - 确认证书文件路径正确 - 确认证书未过期 - 确认私钥文件与证书匹配 - PEM 文件需包含 `-----BEGIN CERTIFICATE-----` 和 `-----BEGIN PRIVATE KEY-----` - 查看启动日志中的证书加载错误信息 ### Q: 如何查看当前版本? ```bash dotnet StarGateway.dll --version ``` 或查看二进制文件属性。 ### Q: 如何实现 HTTPS 访问? 1. 在 StarWeb → 部署管理 → SSL证书 中上传证书 2. 确保证书域名与客户端访问的域名匹配 3. 重启或等待配置刷新,网关自动加载证书 4. 客户端通过 `https://your-domain.com:8800` 访问 ### Q: StarGateway 支持 HTTP/2 吗? 当前版本仅支持 HTTP/1.1 和 WebSocket。HTTP/2 支持在路线图中。 ### Q: 如何处理 StarServer 故障? StarGateway 采用多级兜底策略: 1. StarServer API 不可用 → 回退到本地数据库读取 2. 数据库不可用 → 回退到本地 `gateway.json` 文件 3. 配置文件不可用 → 启动失败并报错 --- ## 9. 相关文档 | 文档 | 说明 | |------|------| | [StarGateway架构.md](/NewLife/Stardust/Blob/master/Doc/StarGateway架构.md) | 架构设计文档,含 Mermaid 架构图和交互时序 | | [StarGateway需求文档.md](/NewLife/Stardust/Blob/master/Doc/StarGateway需求文档.md) | 需求规格说明 | | [StarGateway功能清单.md](/NewLife/Stardust/Blob/master/Doc/StarGateway功能清单.md) | 功能完成状态追踪 | | [StarGateway竞品分析.md](/NewLife/Stardust/Blob/master/Doc/StarGateway竞品分析.md) | 竞品对比与差距分析 | --- > 更多信息请访问 [星尘平台](https://newlifex.com) | [GitHub 仓库](https://github.com/NewLifeX/Stardust)