Skip to content

服务管理 ​

同一套代码提供两个独立服务进程:管理端 API 与用户端 API,可分别启动、停止、部署与扩容。

服务概览 ​

服务启动命令默认地址路由前缀面向对象
管理端 APIgo run . service admin:8001/admin管理后台前端
用户端 APIgo run . service api:8002/api小程序 / APP / H5

地址、超时等由 config.yaml 的 server 段配置:

配置说明默认
server.admin_addr / server.api_addr两端监听地址:8001 / :8002
server.read_header_timeout_seconds读取请求头超时5
server.read_timeout_seconds / write_timeout_seconds读/写超时60
server.idle_timeout_seconds空闲连接超时120
server.shutdown_timeout_seconds优雅停机最长等待15
version系统版本号(必填)无

编译打包 ​

后端编译为单一二进制文件(在 server_api 目录执行):

bash
go build -o server_api .

# 交叉编译示例:Linux 服务器(Apple Silicon 本机打包时)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o server_api .

管理端打包(在 admin_client 目录执行):

bash
pnpm install          # 依赖安装
pnpm build            # 类型检查 + 生产构建,产物在 dist/

管理端打包前的接口地址由构建环境变量决定(.env.production):

dotenv
# 默认使用当前站点域名,由 Nginx 等反代将 /admin、/api 转发到后端
VITE_ADMIN_API_BASE_URL=/
# 直连后端时改为实际地址,如 http://127.0.0.1:8001

发布产物清单:

产物来源说明
server_apigo build后端单一二进制,配合 config.yaml 运行
config.yaml手工维护由 config.example.yaml 复制修改,不入库,含 version 必填项
admin_client/dist/pnpm build管理端静态资源,部署到 Nginx / 对象存储

打包前检查:后端 gofmt -l .、go vet ./...、go build ./... 通过;管理端 pnpm exec vue-tsc --noEmit 通过(详见代码规范)。

启动服务 ​

开发模式:

bash
go run . service admin -c config.yaml   # 管理端 API
go run . service api   -c config.yaml   # 用户端 API

编译部署:

bash
go build -o server_api .
./server_api service admin -c config.yaml
./server_api service api   -c config.yaml

启动成功会输出带版本号的日志(如 管理端 API v0.0.3 启动: http://0.0.0.0:8001),随后是 Gin 的路由注册信息。

启动自检 ​

服务启动阶段会依次执行以下检查,任一失败即拒绝启动并给出明确提示:

  1. 配置校验:version 必填、监听地址非空、MySQL 连接池参数合法;
  2. MySQL / Redis 连接与健康检查;
  3. 核心必需表检查(sys_user、sys_member、sys_menu 等),缺表提示执行对应版本 SQL;
  4. 初始数据检查:sys_user 无账号时提示导入初始化脚本;
  5. 插件检查:数据库中已启用的插件必须已编译进程序,版本、迁移摘要、依赖一致,否则报错阻止启动。

停止与优雅停机 ​

服务监听 SIGINT / SIGTERM,收到信号后:

  1. 取消插件运行 Context,按启动相反顺序调用插件 Stop(受 shutdown_timeout_seconds 约束);
  2. HTTP 服务优雅关闭:停止接收新请求,等待进行中的请求完成,超时后强制退出;
  3. 释放 Redis 与 MySQL 连接。

因此重启服务即插件启停的生效方式:在插件管理页面修改启停状态后,必须重启两端 API。

日志与观测 ​

  • 服务日志:标准库 log + Gin 请求日志(方法、路径、状态码、耗时、来源 IP);
  • 慢 SQL 阈值 1 秒,超时会在日志中告警;
  • 启动即输出版本号,可结合 go run . version -c config.yaml 核对部署版本;
  • 操作审计走 sys_operation_log 表(管理端写操作自动记录),详见功能模块。

部署顺序建议 ​

  1. 停止旧版管理端 API 与用户端 API;
  2. 备份数据库,执行对应版本的增量 SQL;
  3. 更新 config.yaml(含 version),必要时更新反向代理;
  4. 发布并启动新版后端两个服务;
  5. 发布新版 admin_client 静态资源;
  6. 按版本更新中的部署检查清单冒烟验证。

生产环境建议使用 systemd / supervisor 等守护进程管理两个服务进程,异常退出自动拉起。以 systemd 为例:

ini
[Unit]
Description=cf_Ghbf Admin API
After=network.target mysql.service redis.service

[Service]
WorkingDirectory=/opt/go_basic_frame/server_api
ExecStart=/opt/go_basic_frame/server_api/server_api service admin -c config.yaml
Restart=always
RestartSec=3
KillSignal=SIGTERM

[Install]
WantedBy=multi-user.target

注意

用户端与管理端是两个独立进程,需要分别配置守护;Restart + SIGTERM 配合服务内置的优雅停机,可保证升级时请求不丢。