一个平台服务,多个业务进程
平台注册为 Windows 服务后,开机后台运行,自动加载已登记的工单、费用报销和请假等模块。模块仍由平台通过 go-plugin 启动,不需要分别注册 Windows 服务。网页访问地址及账号权限保持不变。
1. 安装与启动
将完整运行包放在固定目录,在该目录打开管理员终端执行:
.\platform.exe service install .\platform.exe service start .\platform.exe service status
默认服务名 CollabPlatform,延迟自动启动,使用 LocalService 账号。安装命令为该服务的专属 SID 授予 data/、logs/ 修改权限,modules/ 读取执行权限和平台 EXE 读取执行权限,不授予管理员权限。安装不会自动启动;start 负责启动。
已有控制台平台占用相同端口或数据目录时,先关闭控制台平台。安装前备份 data/;不要同时运行控制台版和服务版共享一个数据目录。网页首次运行仍按原有规则初始化管理员;已有账号与密码不会因为服务安装而重置。
2. 常用命令
.\platform.exe service status .\platform.exe service stop .\platform.exe service start .\platform.exe service restart .\platform.exe service uninstall
停止会先排空 HTTP 请求,再关闭模块进程。卸载会先停止服务,再移除服务登记;保留数据、模块、日志及专属 SID 的文件权限条目。若还要继续使用控制台运行,直接执行 platform.exe。停止平台注册服务后,Windows 不会把正常停止当成故障重启。
3. 自定义目录和服务名
.\platform.exe service install -service-name CollabPlatformDemo -addr 127.0.0.1:17881 -data-dir D:\CollabData -module-dir D:\CollabModules -log-dir D:\CollabLogs .\platform.exe service start -service-name CollabPlatformDemo .\platform.exe service status -service-name CollabPlatformDemo
安装时将绝对路径写入服务配置,避免系统服务工作目录影响数据定位。安装后不能直接移动 EXE;需要先停止、卸载,再从新位置安装,并继续指定原数据目录。控制命令会核对服务所属 EXE,拒绝操作其他程序的服务。
4. 日志与排错
默认 logs/platform.log 包含平台及模块通信日志,单文件约 5 MiB,保留 3 个历史文件。可用 -log-dir 指定目录。当前服务账号必须有权读取模块包,数据与日志目录必须可写。状态命令以 JSON 输出进程 ID、账号、启动方式和 EXE 路径。
无法启动时先查日志、端口占用及数据目录锁,再查 Windows 事件查看器。模块状态失败不一定代表平台服务失败:平台可以保持运行供管理员修复模块。
5. 两层故障恢复
| 故障 | 行为 |
|---|---|
| 模块意外退出或 RPC 失败 | 平台检测后以约 1、2、4 秒退避,最多自动尝试 3 次;达到上限后等待管理员点击启动。持续稳定运行 10 分钟后清除重试计数。 |
| 管理员停止模块 | 本次平台运行期间保持停止;平台下次启动会加载仍已登记的模块。取消注册才会阻止下次加载。 |
| 平台服务意外退出 | Windows 服务恢复策略依次等待 5、15、60 秒重启;之后不再自动重试,稳定计数按系统的 1 小时重置规则处理。 |
| 平台进程被终止 | Windows Job Object 清理平台拥有的模块进程,避免残留进程占用端口。 |
| 正常停止或关机 | 收到服务停止 / 关机信号,排空请求并清理模块。下次开机按自动启动配置恢复。 |
重启会使浏览器登录会话失效,需要重新登录;业务数据、账号及模块登记保留。故障发生前未确认的写请求,仍应使用原请求号查询或幂等重试。
6. 更新与验证
更新前停止服务、备份完整 data/,再替换 EXE 和对应模块包并启动。服务模式不增加数据库迁移或无停机升级能力。不得覆盖现有业务库。运行包不包含当前演示库的工单、账号或密码数据。
源码提供 scripts/service_smoke_test.py,在临时服务与目录中验证安装、LocalService 运行、业务调用、模块故障恢复、主进程故障恢复、清理与卸载,不向现有业务库写入测试工单。开机自动启动配置已核对,测试不会为了验证而重启用户电脑。