344 lines
15 KiB
Markdown
344 lines
15 KiB
Markdown
# 部署运维
|
||
|
||
<cite>
|
||
**本文引用的文件**
|
||
- [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)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [简介](#简介)
|
||
2. [项目结构](#项目结构)
|
||
3. [核心组件](#核心组件)
|
||
4. [架构总览](#架构总览)
|
||
5. [详细组件分析](#详细组件分析)
|
||
6. [依赖分析](#依赖分析)
|
||
7. [性能考虑](#性能考虑)
|
||
8. [故障排除指南](#故障排除指南)
|
||
9. [结论](#结论)
|
||
10. [附录](#附录)
|
||
|
||
## 简介
|
||
本运维文档面向 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 模块与依赖声明
|
||
|
||
```mermaid
|
||
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](file://cmd/server/main.go#L1-L96)
|
||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||
- [internal/middleware/cors.go:7-19](file://internal/middleware/cors.go#L7-L19)
|
||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||
|
||
章节来源
|
||
- [README.md:5-17](file://README.md#L5-L17)
|
||
- [go.mod:1-47](file://go.mod#L1-L47)
|
||
|
||
## 核心组件
|
||
- 配置加载与校验:集中于 config 包,支持从环境变量覆盖默认值,并对生产环境进行强制校验(如数据库密码)
|
||
- 数据库连接:使用 MySQL 驱动,配置连接池参数并在启动时进行连通性校验
|
||
- 缓存连接:Redis 客户端初始化,支持主机、端口、密码、库号
|
||
- 搜索服务:Meilisearch 客户端初始化,提供模型列表检索能力
|
||
- 路由与中间件:Gin 路由注册,内置 CORS、请求日志、请求 ID、恢复中间件
|
||
- 日志:Zap 生产/开发差异化配置,按状态输出不同级别日志
|
||
|
||
章节来源
|
||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||
- [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72)
|
||
- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57)
|
||
- [internal/config/meilisearch.go:14-51](file://internal/config/meilisearch.go#L14-L51)
|
||
- [internal/database/mysql.go:14-47](file://internal/database/mysql.go#L14-L47)
|
||
- [internal/cache/redis.go:10-17](file://internal/cache/redis.go#L10-L17)
|
||
- [internal/search/meilisearch.go:17-46](file://internal/search/meilisearch.go#L17-L46)
|
||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||
- [internal/middleware/cors.go:7-19](file://internal/middleware/cors.go#L7-L19)
|
||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||
|
||
## 架构总览
|
||
应用启动流程:读取配置 → 初始化日志 → 连接数据库/缓存/搜索 → 注册路由与中间件 → 启动 HTTP 服务器 → 监听系统信号优雅退出。
|
||
|
||
```mermaid
|
||
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](file://cmd/server/main.go#L22-L96)
|
||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||
- [internal/database/mysql.go:14-47](file://internal/database/mysql.go#L14-L47)
|
||
- [internal/cache/redis.go:10-17](file://internal/cache/redis.go#L10-L17)
|
||
- [internal/search/meilisearch.go:17-20](file://internal/search/meilisearch.go#L17-L20)
|
||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||
|
||
## 详细组件分析
|
||
|
||
### 配置与环境管理
|
||
- 环境变量键与默认值
|
||
- 运行环境: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](file://internal/config/config.go#L18-L56)
|
||
- [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72)
|
||
- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57)
|
||
- [internal/config/meilisearch.go:14-51](file://internal/config/meilisearch.go#L14-L51)
|
||
- [README.md:39-73](file://README.md#L39-L73)
|
||
|
||
### 数据库连接与连接池
|
||
- 连接参数:用户、密码、TCP 地址、数据库名、字符集与时区参数
|
||
- 连接池:最大并发、空闲连接数、连接生命周期
|
||
- 启动校验:超时上下文下执行 Ping,失败则关闭并返回错误
|
||
|
||
章节来源
|
||
- [internal/database/mysql.go:14-47](file://internal/database/mysql.go#L14-L47)
|
||
|
||
### 缓存与搜索
|
||
- Redis:按主机:端口、密码、库号初始化客户端
|
||
- Meilisearch:按主机与 API Key 初始化索引客户端,提供模型列表检索方法
|
||
|
||
章节来源
|
||
- [internal/cache/redis.go:10-17](file://internal/cache/redis.go#L10-L17)
|
||
- [internal/search/meilisearch.go:17-46](file://internal/search/meilisearch.go#L17-L46)
|
||
|
||
### 路由与中间件
|
||
- 路由分组:/api/v1(健康检查)、/audio(品牌、型号、设备上报、模型列表等)
|
||
- 中间件:恢复、请求 ID、日志、CORS
|
||
- 日志字段:状态码、方法、路径、耗时、客户端 IP、请求 ID、查询参数、错误信息
|
||
|
||
章节来源
|
||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||
- [internal/middleware/cors.go:7-19](file://internal/middleware/cors.go#L7-L19)
|
||
|
||
### 日志与运行模式
|
||
- 开发模式:开发配置,彩色日志等级编码
|
||
- 生产模式:生产配置,ISO 时间编码
|
||
- Gin 模式:生产模式启用 ReleaseMode
|
||
|
||
章节来源
|
||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||
- [cmd/server/main.go:28-30](file://cmd/server/main.go#L28-L30)
|
||
|
||
## 依赖分析
|
||
- 外部依赖:Gin、MySQL 驱动、Meilisearch SDK、Redis SDK、Zap
|
||
- 内部耦合:main.go 依赖 config、database、cache、search、router、logger;router 依赖 handler、middleware、search、redis;middleware 依赖 Gin 与 Zap
|
||
|
||
```mermaid
|
||
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"]
|
||
```
|
||
|
||
图表来源
|
||
- [cmd/server/main.go:13-18](file://cmd/server/main.go#L13-L18)
|
||
- [internal/router/router.go:3-12](file://internal/router/router.go#L3-L12)
|
||
|
||
章节来源
|
||
- [go.mod:5-46](file://go.mod#L5-L46)
|
||
|
||
## 性能考虑
|
||
- 连接池与超时
|
||
- 数据库连接池:最大并发、空闲连接、连接生命周期,减少连接抖动与资源占用
|
||
- 启动 Ping 超时:避免冷启动阻塞
|
||
- Gin 服务器超时
|
||
- 读取超时、写入超时、空闲超时,防止慢请求与资源泄漏
|
||
- 日志级别
|
||
- 错误与警告输出到生产日志,降低高基数日志对性能影响
|
||
- 搜索与缓存
|
||
- 合理设置搜索 Limit 与 AttributesToRetrieve,避免返回过多字段
|
||
- 缓存命中率优先,避免频繁访问上游服务
|
||
|
||
章节来源
|
||
- [internal/database/mysql.go:33-35](file://internal/database/mysql.go#L33-L35)
|
||
- [cmd/server/main.go:66-72](file://cmd/server/main.go#L66-L72)
|
||
- [internal/middleware/logger.go:37-43](file://internal/middleware/logger.go#L37-L43)
|
||
|
||
## 故障排除指南
|
||
- 启动失败(数据库连接)
|
||
- 现象:启动日志显示数据库连接失败
|
||
- 排查:确认 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](file://cmd/server/main.go#L40-L48)
|
||
- [internal/config/database.go:57-71](file://internal/config/database.go#L57-L71)
|
||
- [internal/config/redis.go:51-56](file://internal/config/redis.go#L51-L56)
|
||
- [internal/config/meilisearch.go:39-50](file://internal/config/meilisearch.go#L39-L50)
|
||
- [internal/middleware/logger.go:22-43](file://internal/middleware/logger.go#L22-L43)
|
||
- [README.md:83-99](file://README.md#L83-L99)
|
||
|
||
## 结论
|
||
本项目提供了清晰的配置加载、中间件与路由结构,以及对数据库、缓存与搜索服务的标准化接入。通过明确的环境变量与校验规则,配合生产/开发差异化日志与 Gin 模式,可实现稳定高效的部署与运维。建议在生产环境中严格管理密钥与网络访问控制,并结合监控与日志体系完善可观测性。
|
||
|
||
## 附录
|
||
|
||
### 构建与运行
|
||
- 构建:使用 Makefile 的 build 目标生成二进制
|
||
- 运行:使用 Makefile 的 run 目标或直接运行二进制
|
||
- 测试:使用 Makefile 的 test 目标
|
||
|
||
章节来源
|
||
- [Makefile:3-13](file://Makefile#L3-L13)
|
||
- [README.md:75-81](file://README.md#L75-L81)
|
||
|
||
### 环境变量与默认值
|
||
- APP_ENV、APP_HOST、APP_PORT、GIN_MODE
|
||
- DATABASE_*、REDIS_*、MEILISEARCH_*
|
||
|
||
章节来源
|
||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||
- [README.md:39-73](file://README.md#L39-L73)
|
||
|
||
### 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 建议,不直接对应具体源文件] |