15 KiB
15 KiB
部署运维
**本文引用的文件** - [cmd/server/main.go](file://cmd/server/main.go) - [internal/config/config.go](file://internal/config/config.go) - [internal/config/database.go](file://internal/config/database.go) - [internal/config/redis.go](file://internal/config/redis.go) - [internal/config/meilisearch.go](file://internal/config/meilisearch.go) - [internal/database/mysql.go](file://internal/database/mysql.go) - [internal/cache/redis.go](file://internal/cache/redis.go) - [internal/search/meilisearch.go](file://internal/search/meilisearch.go) - [internal/router/router.go](file://internal/router/router.go) - [internal/middleware/cors.go](file://internal/middleware/cors.go) - [internal/middleware/logger.go](file://internal/middleware/logger.go) - [pkg/logger/logger.go](file://pkg/logger/logger.go) - [Makefile](file://Makefile) - [go.mod](file://go.mod) - [README.md](file://README.md)目录
简介
本运维文档面向 Luxsin 应用 API 项目的部署与运行维护,覆盖构建流程、环境配置与差异、数据库与外部服务连接、容器化与编排部署建议、监控与日志、性能优化、故障排查、备份恢复与版本升级、安全与合规以及自动化与 CI/CD 集成要点。目标是帮助运维人员快速、稳定地完成部署与日常运维。
项目结构
该应用采用分层与功能模块化组织,核心入口在命令行程序,配置集中于内部包,业务路由与中间件位于独立模块,日志封装在可复用包中。关键目录与职责概览:
- cmd/server:应用入口,负责初始化配置、连接数据库与缓存、启动 HTTP 服务器、优雅关闭
- internal/config:集中加载与校验环境变量,生成运行所需配置
- internal/database:MySQL 连接与连接池配置
- internal/cache:Redis 客户端初始化
- internal/search:Meilisearch 客户端初始化与检索封装
- internal/router:路由注册与中间件装配
- internal/middleware:CORS、请求日志、请求 ID 等中间件
- pkg/logger:Zap 日志配置(开发/生产差异化)
- Makefile:常用构建与测试命令
- go.mod:Go 模块与依赖声明
graph TB
subgraph "应用进程"
MAIN["cmd/server/main.go"]
ROUTER["internal/router/router.go"]
MW_CORS["internal/middleware/cors.go"]
MW_LOGGER["internal/middleware/logger.go"]
CFG["internal/config/config.go"]
LOGPKG["pkg/logger/logger.go"]
end
subgraph "外部服务"
MYSQL["MySQL 数据库"]
REDIS["Redis 缓存"]
MEILI["Meilisearch 搜索"]
end
MAIN --> CFG
MAIN --> LOGPKG
MAIN --> ROUTER
ROUTER --> MW_CORS
ROUTER --> MW_LOGGER
MAIN --> MYSQL
MAIN --> REDIS
MAIN --> MEILI
图表来源
- cmd/server/main.go:1-96
- internal/router/router.go:14-41
- internal/middleware/cors.go:7-19
- internal/middleware/logger.go:10-45
- internal/config/config.go:18-56
- pkg/logger/logger.go:8-19
章节来源
核心组件
- 配置加载与校验:集中于 config 包,支持从环境变量覆盖默认值,并对生产环境进行强制校验(如数据库密码)
- 数据库连接:使用 MySQL 驱动,配置连接池参数并在启动时进行连通性校验
- 缓存连接:Redis 客户端初始化,支持主机、端口、密码、库号
- 搜索服务:Meilisearch 客户端初始化,提供模型列表检索能力
- 路由与中间件:Gin 路由注册,内置 CORS、请求日志、请求 ID、恢复中间件
- 日志:Zap 生产/开发差异化配置,按状态输出不同级别日志
章节来源
- internal/config/config.go:18-56
- internal/config/database.go:17-72
- internal/config/redis.go:16-57
- internal/config/meilisearch.go:14-51
- internal/database/mysql.go:14-47
- internal/cache/redis.go:10-17
- internal/search/meilisearch.go:17-46
- internal/router/router.go:14-41
- internal/middleware/cors.go:7-19
- internal/middleware/logger.go:10-45
- pkg/logger/logger.go:8-19
架构总览
应用启动流程:读取配置 → 初始化日志 → 连接数据库/缓存/搜索 → 注册路由与中间件 → 启动 HTTP 服务器 → 监听系统信号优雅退出。
sequenceDiagram
participant OS as "操作系统"
participant MAIN as "main.go"
participant CFG as "config.Load()"
participant LOG as "logger.New()"
participant DB as "database.Open()"
participant RS as "cache.NewClient()"
participant MS as "search.NewClient()"
participant RT as "router.New()"
participant HTTP as "http.Server"
OS->>MAIN : 启动进程
MAIN->>CFG : 加载配置
MAIN->>LOG : 创建日志实例
MAIN->>DB : 打开数据库连接
MAIN->>RS : 初始化 Redis 客户端
MAIN->>MS : 初始化 Meilisearch 客户端
MAIN->>RT : 构建路由引擎
MAIN->>HTTP : 启动 HTTP 服务器
OS-->>MAIN : 发送终止信号
MAIN->>HTTP : 优雅关闭
图表来源
- cmd/server/main.go:22-96
- internal/config/config.go:18-56
- pkg/logger/logger.go:8-19
- internal/database/mysql.go:14-47
- internal/cache/redis.go:10-17
- internal/search/meilisearch.go:17-20
- internal/router/router.go:14-41
详细组件分析
配置与环境管理
- 环境变量键与默认值
- 运行环境:APP_ENV(默认 development),用于切换生产模式与日志配置
- 监听地址与端口:APP_HOST、APP_PORT(默认 0.0.0.0:8080)
- Gin 运行模式:GIN_MODE(由 APP_ENV 控制,生产模式使用 ReleaseMode)
- 数据库:DATABASE_HOST、DATABASE_PORT、DATABASE_NAME、DATABASE_USER、DATABASE_PASSWORD(生产环境必须提供 DATABASE_PASSWORD)
- Redis:REDIS_HOST、REDIS_PORT、REDIS_PASSWORD、REDIS_DATABASE
- Meilisearch:MEILISEARCH_HOST、MEILISEARCH_API_KEY、MEILISEARCH_INDEX
- 环境差异
- 开发环境:本地 MySQL、公网 Meilisearch、默认 Redis 地址
- 生产环境:AWS RDS 主机、内网 Meilisearch 主机、固定 Redis 参数
- 校验规则
- 数据库:生产环境必须提供密码;必填项校验
- Redis:必填主机
- Meilisearch:必填主机、API Key、索引名
章节来源
- internal/config/config.go:18-56
- internal/config/database.go:17-72
- internal/config/redis.go:16-57
- internal/config/meilisearch.go:14-51
- README.md:39-73
数据库连接与连接池
- 连接参数:用户、密码、TCP 地址、数据库名、字符集与时区参数
- 连接池:最大并发、空闲连接数、连接生命周期
- 启动校验:超时上下文下执行 Ping,失败则关闭并返回错误
章节来源
缓存与搜索
- Redis:按主机:端口、密码、库号初始化客户端
- Meilisearch:按主机与 API Key 初始化索引客户端,提供模型列表检索方法
章节来源
路由与中间件
- 路由分组:/api/v1(健康检查)、/audio(品牌、型号、设备上报、模型列表等)
- 中间件:恢复、请求 ID、日志、CORS
- 日志字段:状态码、方法、路径、耗时、客户端 IP、请求 ID、查询参数、错误信息
章节来源
- internal/router/router.go:14-41
- internal/middleware/logger.go:10-45
- internal/middleware/cors.go:7-19
日志与运行模式
- 开发模式:开发配置,彩色日志等级编码
- 生产模式:生产配置,ISO 时间编码
- Gin 模式:生产模式启用 ReleaseMode
章节来源
依赖分析
- 外部依赖:Gin、MySQL 驱动、Meilisearch SDK、Redis SDK、Zap
- 内部耦合:main.go 依赖 config、database、cache、search、router、logger;router 依赖 handler、middleware、search、redis;middleware 依赖 Gin 与 Zap
graph LR
MAIN["cmd/server/main.go"] --> CFG["internal/config/*"]
MAIN --> DB["internal/database/mysql.go"]
MAIN --> RC["internal/cache/redis.go"]
MAIN --> SRCH["internal/search/meilisearch.go"]
MAIN --> RT["internal/router/router.go"]
RT --> MW["internal/middleware/*"]
RT --> HND["internal/handler/*"]
MAIN --> LOG["pkg/logger/logger.go"]
图表来源
章节来源
性能考虑
- 连接池与超时
- 数据库连接池:最大并发、空闲连接、连接生命周期,减少连接抖动与资源占用
- 启动 Ping 超时:避免冷启动阻塞
- Gin 服务器超时
- 读取超时、写入超时、空闲超时,防止慢请求与资源泄漏
- 日志级别
- 错误与警告输出到生产日志,降低高基数日志对性能影响
- 搜索与缓存
- 合理设置搜索 Limit 与 AttributesToRetrieve,避免返回过多字段
- 缓存命中率优先,避免频繁访问上游服务
章节来源
故障排除指南
- 启动失败(数据库连接)
- 现象:启动日志显示数据库连接失败
- 排查:确认 DATABASE_HOST/PORT/NAME/USER/PASSWORD;生产环境必须提供 DATABASE_PASSWORD;检查网络连通与安全组
- 启动失败(Redis 连接)
- 现象:无法连接缓存
- 排查:确认 REDIS_HOST/PORT/Password/Database;检查网络与认证
- 启动失败(Meilisearch 连接)
- 现象:搜索初始化失败或查询报错
- 排查:确认 MEILISEARCH_HOST/APIKey/Index;检查索引是否存在与权限
- 健康检查
- 访问 /api/v1/health,确认服务可用
- 日志定位
- 查看请求日志中的状态码、路径、耗时、请求 ID,结合错误字段定位问题
章节来源
- cmd/server/main.go:40-48
- internal/config/database.go:57-71
- internal/config/redis.go:51-56
- internal/config/meilisearch.go:39-50
- internal/middleware/logger.go:22-43
- README.md:83-99
结论
本项目提供了清晰的配置加载、中间件与路由结构,以及对数据库、缓存与搜索服务的标准化接入。通过明确的环境变量与校验规则,配合生产/开发差异化日志与 Gin 模式,可实现稳定高效的部署与运维。建议在生产环境中严格管理密钥与网络访问控制,并结合监控与日志体系完善可观测性。
附录
构建与运行
- 构建:使用 Makefile 的 build 目标生成二进制
- 运行:使用 Makefile 的 run 目标或直接运行二进制
- 测试:使用 Makefile 的 test 目标
章节来源
环境变量与默认值
- APP_ENV、APP_HOST、APP_PORT、GIN_MODE
- DATABASE_、REDIS_、MEILISEARCH_*
章节来源
Docker 容器化部署建议
- 基础镜像:使用官方 Go 镜像进行多阶段构建,最终运行精简基础镜像
- 构建步骤:在构建阶段执行 go build 产出二进制,运行阶段仅拷贝二进制与必要资源
- 环境变量:通过镜像启动参数注入 APP_ENV、DATABASE_、REDIS_、MEILISEARCH_* 等
- 健康检查:暴露 /api/v1/health,使用 HTTP 方式探测
- 日志:容器标准输出采集,结合日志驱动输出到集中日志系统
[本节为通用容器化建议,不直接对应具体源文件]
Kubernetes 部署示例要点
- Deployment:副本数、资源限制、探针(Liveness/Readiness)
- Service:ClusterIP/LoadBalancer,暴露监听端口
- ConfigMap:存放非敏感配置(如 APP_ENV)
- Secret:存放数据库密码、Redis 密码、Meilisearch API Key
- Ingress:域名与 TLS(如需要)
- HPA:基于 CPU/自定义指标扩缩容
[本节为通用编排建议,不直接对应具体源文件]
监控与告警
- 指标:QPS、P95/P99 延迟、错误率、连接池使用率、搜索延迟
- 日志:请求日志、错误日志、启动/关闭事件
- 告警:错误率阈值、延迟阈值、连接池耗尽、外部服务不可用
[本节为通用监控建议,不直接对应具体源文件]
备份与恢复
- 数据库:定期逻辑备份与增量备份,验证恢复流程
- 缓存:关注热数据重建策略,避免单点失效
- 配置:Secret/ConfigMap 版本化管理,变更审计
[本节为通用备份建议,不直接对应具体源文件]
版本升级流程
- 预发布:灰度最小集群,验证健康检查与关键接口
- 升级:滚动更新,观察指标与日志
- 回滚:快速回滚至上一个稳定版本
- 文档:记录变更与回滚步骤
[本节为通用升级建议,不直接对应具体源文件]
安全与合规
- 最小权限:数据库、缓存、搜索服务账号只授予必要权限
- 网络隔离:生产网络与开发网络分离,安全组放通最小范围
- 密钥管理:通过 Secret 管理密钥,禁用明文存储
- 合规:日志保留策略、访问审计、数据加密传输
[本节为通用安全建议,不直接对应具体源文件]
自动化部署与 CI/CD 集成
- 构建:在 CI 中执行 go mod tidy、go test、go build
- 扫描:静态扫描与依赖漏洞扫描
- 镜像:构建镜像并推送制品库
- 部署:Kubernetes 应用清单与版本标签管理
- 回滚:支持一键回滚至上一个版本
[本节为通用 CI/CD 建议,不直接对应具体源文件]