# fix-tool **Repository Path**: coding_niann/fix-tool ## Basic Information - **Project Name**: fix-tool - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-27 - **Last Updated**: 2026-08-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Tomcat Watchdog v3 — 单中心多集群监控 一个 Tomcat 假死监控工具,从单机版(v2)演进为**单中心 · 多集群**架构: - **agent(客户端)**:部署在每台 Tomcat 服务器上,负责本机发现、四维检测、假死自动重启,并上行接入中心服务器。 - **server(中心服务器)**:聚合所有 agent,按 `cluster` 分桶,提供统一控制台 / REST API / WebSocket(`/agent`)指令下发。 ## 架构 ``` ┌─────────────────────────────────────────────┐ │ center server (9091) │ │ SQLite 持久化 · 集群分桶 · 指令下发 · 控制台 │ └───────▲───────────────▲───────────────▲─────┘ WS/agent│ WS/agent│ WS/agent│ ┌────────┴───┐ ┌────────┴───┐ ┌────────┴───┐ │ agent (集群A)│ │ agent (集群A)│ │ agent (集群B)│ │ Tomcat 1 │ │ Tomcat 2 │ │ Tomcat 3 │ └────────────┘ └────────────┘ └────────────┘ ``` - **协议零改动**:复用 `internal/protocol` C/S 契约(`hello/helloAck/status/events/cmd/cmdAck`),上行 `status/events`,下行 `cmd/cmdAck`。 - **客户端零持久化**:agent 本地事件仅内存缓冲 + 滚动日志;事件归属(已确认送达)完全以服务器 `helloAck` 回传的 `lastEventSeq` 游标为准。 - **事件续传**:断线重连后 agent 从游标处 `EventsSince(cursor)` 增量补发,服务器以 `(clientId, seq)` 唯一索引幂等去重。 - **SQLite(纯 Go 无 cgo)**:`modernc.org/sqlite`,兼容 Go 1.20 与 Win2008;库表 `events(client_id, cluster, seq, time, instance, event)`。 ## agent 功能(继承 v2) - **自动发现**:扫描本机 Java Tomcat 进程与 Windows Tomcat/procrun 服务,按 `catalina.base` 分组,提取 `server.xml` HTTP Connector 端口(排除 AJP)。 - **四维检测**:进程(`tasklist`)→ 端口(`netstat`)→ TCP(`net.DialTimeout`)→ HTTP(GET,`404/500/503` 均算存活)。 - **状态机**:`GRACE → HEALTHY / HANG / DOWN → RESTARTING → RESTART_SUCCESS / RESTART_FAILED → CRITICAL`。 - **限制与宽限**:启动宽限期、滑动窗口重启上限(达上限转 CRITICAL 暂停)、重启冷却、重启后三查确认。 - **事件历史**:内存环缓冲 500 条 + `logs/watchdog.log`(5MB 轮转 ×5)。 ## 目录结构 | 路径 | 职责 | |---|---| | `cmd/watchdog/main.go` | agent 入口(挂载 uplink,双模式) | | `cmd/server/main.go` | server 入口 | | `internal/core/*` | 单机监控核心(发现/探测/状态机/重启/事件/GUI) | | `internal/uplink/*` | agent 上行连接器(连接/上报/执行指令) | | `internal/server/*` | 中心服务器(网关/注册表/SQLite/REST/控制台) | | `internal/protocol/*` | C/S 共享契约(叶子包,无内部依赖) | | `deploy/` | server/agent 示例 `config.json` | | `Dockerfile` | 多阶段双镜像(`server` / `agent`) | | `docker-compose.yml` | 单 server + 多 agent 一键演示 | ## 运行方式 ### 1. Windows 二进制 ```bat build.bat ``` 生成 4 个文件:`tomcat-watchdog*.exe`(agent)、`watchdog-server*.exe`(server)。 - **server**:`watchdog-server.exe`,监听 `0.0.0.0:9091`,数据库 `store.db`,token 默认 `changeme`。 - **agent**:`tomcat-watchdog.exe`,不配 `server` 段即单机;配 `server` 段并 `enabled:true` 即接入中心。 ### 2. agent 接入配置 在 agent 的 exe 同目录 `config.json` 追加 `server` 段: ```json { "server": { "enabled": true, "url": "ws://192.168.1.10:9091/agent", "token": "changeme", "clientId": "agent-1", "cluster": "集群A", "reportInterval": 15 } } ``` - `clientId` 留空则用主机名;`cluster` 决定服务器端分桶;改配置热加载即时生效(断开重连后按新 cluster 归属)。 ### 3. Docker 运行 ```bash # 交叉编译 Linux 二进制 GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o build/server-linux ./cmd/server GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o build/agent-linux ./cmd/watchdog # 一键起 1 server + 3 agent docker compose build docker compose up ``` 打开 `http://localhost:9091/` 查看控制台。 ## 服务器 API | 方法 | 路径 | 说明 | |---|---|---| | GET | `/api/clusters` | 集群分桶视图(cluster → 节点 + healthy/down/critical/offline 统计) | | GET | `/api/nodes` | 所有节点实例快照 | | GET | `/api/events` | 最近事件(内存环缓冲,最新在前) | | POST | `/api/cmd` | 指令下发(`{"action","clientId","target","params"}`) | | GET | `/health` | 服务器存活 | ### 指令动作(action) | action | 说明 | |---|---| | `restart` | 手动重启实例 | | `toggle` | 切换自动重启开关 | | `reset-limit` | 重置重启限制(CRITICAL 恢复) | | `rescan` | 触发重新扫描 | | `get-config` / `set-config` | 读/下发监控配置 | ## 服务器配置(server/config.json) ```json { "webAddr": "0.0.0.0:9091", "tokens": ["changeme"], "dbPath": "store.db" } ``` ## 编译 - 要求 Go 1.20。 - agent 目标 Win2008/2008R2/2012+,零 cgo(不依赖 NSSM 等额外 Agent)。 - 跨平台交叉编译:`GOOS=linux GOARCH=amd64 CGO_ENABLED=0`(SQLite 为纯 Go,Docker 可用)。 ## 注意 - 自动重启 Tomcat/Windows Service 需管理员权限;agent GUI 默认仅监听 `127.0.0.1:9090`。 - Linux 容器内无 `wmic` / `tasklist`,agent 的本机发现/重启能力受限(`netstat` 可替换 `ss`),Docker 主要用于验证 WS 接入与上报闭环;生产以 Windows 原机运行为准。