13 KiB
13 KiB
快速开始
**本文引用的文件** - [README.md](file://README.md) - [go.mod](file://go.mod) - [Makefile](file://Makefile) - [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/router/router.go](file://internal/router/router.go) - [internal/handler/health.go](file://internal/handler/health.go) - [internal/handler/brand.go](file://internal/handler/brand.go) - [internal/response/response.go](file://internal/response/response.go) - [internal/database/mysql.go](file://internal/database/mysql.go) - [internal/search/meilisearch.go](file://internal/search/meilisearch.go) - [internal/cache/redis.go](file://internal/cache/redis.go) - [internal/middleware/logger.go](file://internal/middleware/logger.go)目录
简介
本指南面向新手开发者,帮助你在本地快速搭建 Luxsin 应用 API 的开发与运行环境。你将了解环境要求、依赖安装、配置设置(含 .env 示例)、开发与生产环境差异、数据库与搜索引擎/缓存连接配置,以及如何使用 Makefile 进行构建与运行。同时提供健康检查、品牌查询等基础接口的使用示例,确保你能顺利启动服务并验证功能。
项目结构
项目采用分层与按功能模块组织的结构,核心入口在 cmd/server,配置、路由、处理器、中间件、数据库、缓存、搜索引擎、统一响应体等均按职责划分到 internal 与 pkg 下。
graph TB
subgraph "入口"
MAIN["cmd/server/main.go"]
end
subgraph "配置层"
CFG["internal/config/*"]
end
subgraph "数据访问"
DB["internal/database/mysql.go"]
REDIS["internal/cache/redis.go"]
MS["internal/search/meilisearch.go"]
end
subgraph "业务层"
ROUTER["internal/router/router.go"]
HANDLERS["internal/handler/*"]
RESP["internal/response/response.go"]
MW["internal/middleware/*"]
end
MAIN --> CFG
MAIN --> DB
MAIN --> REDIS
MAIN --> MS
MAIN --> ROUTER
ROUTER --> HANDLERS
HANDLERS --> RESP
ROUTER --> MW
图表来源
章节来源
核心组件
- 入口程序:负责加载配置、初始化日志、数据库、搜索引擎与缓存客户端,创建路由并启动 HTTP 服务器。
- 配置系统:集中读取环境变量,支持开发与生产环境默认值,以及通过 DATABASE_、REDIS_、MEILISEARCH_* 等前缀覆盖。
- 路由与处理器:定义 /api/v1/health 与 /audio/* 等业务接口。
- 统一响应体:规范所有接口返回结构,便于前端消费与错误处理。
- 中间件:日志、CORS、请求 ID 等通用能力。
- 数据库/搜索引擎/缓存:MySQL、Meilisearch、Redis 客户端初始化与校验。
章节来源
- cmd/server/main.go:22-96
- internal/config/config.go:18-56
- internal/router/router.go:14-41
- internal/response/response.go:9-37
架构总览
下图展示了从入口到各子系统的调用关系与数据流。
sequenceDiagram
participant Entrypoint as "入口(main)"
participant Cfg as "配置(Config)"
participant Log as "日志(Logger)"
participant DB as "数据库(MySQL)"
participant MS as "搜索引擎(Meilisearch)"
participant RC as "缓存(Redis)"
participant RT as "路由(Router)"
participant H as "处理器(Handlers)"
Entrypoint->>Cfg : 加载配置
Entrypoint->>Log : 初始化日志
Entrypoint->>DB : 打开连接
Entrypoint->>MS : 创建客户端
Entrypoint->>RC : 创建客户端
Entrypoint->>RT : 注册路由
RT->>H : 调用处理器
H-->>Entrypoint : 统一响应体
图表来源
详细组件分析
启动流程与控制循环
- 入口加载配置,按环境设置 Gin 模式。
- 初始化日志、数据库、搜索引擎与缓存。
- 创建 HTTP 服务器并启动协程监听。
- 通过信号量优雅关闭,设置超时上下文。
flowchart TD
Start(["启动"]) --> LoadCfg["加载配置"]
LoadCfg --> SetMode["设置运行模式"]
SetMode --> InitLog["初始化日志"]
InitLog --> OpenDB["打开数据库连接"]
OpenDB --> InitSearch["初始化搜索引擎"]
InitSearch --> InitRedis["初始化缓存"]
InitRedis --> BuildRouter["构建路由"]
BuildRouter --> StartHTTP["启动HTTP服务"]
StartHTTP --> WaitSignal["等待退出信号"]
WaitSignal --> Graceful["优雅关闭(带超时)"]
Graceful --> End(["结束"])
图表来源
章节来源
配置系统与环境变量
- 关键变量
- APP_ENV:运行环境(development/production),影响数据库、搜索引擎、缓存默认值与 Gin 模式。
- APP_HOST:监听地址,默认 0.0.0.0。
- APP_PORT:监听端口,默认 8080。
- GIN_MODE:Gin 运行模式(debug/release),生产环境自动切换为 release。
- 数据库覆盖优先级:若设置 DATABASE_HOST 则完全以 DATABASE_* 环境变量为准;否则按 APP_ENV 选择默认值。
- 生产环境必须提供 DATABASE_PASSWORD;搜索引擎与缓存同理,可通过 MEILISEARCH_* 与 REDIS_* 覆盖。
章节来源
- internal/config/config.go:18-56
- internal/config/database.go:17-72
- internal/config/meilisearch.go:14-51
- internal/config/redis.go:16-57
- README.md:39-45
- README.md:46-56
路由与接口
- /api/v1/health:健康检查接口,返回状态 up。
- /audio/getBrand:品牌列表查询,支持按 brandName 参数模糊过滤。
- /audio/getModel:型号查询(具体参数与行为见处理器实现)。
- /audio/modelList:基于搜索引擎的型号列表检索。
- /audio/reportDevInfo:设备信息上报(具体参数与行为见处理器实现)。
章节来源
统一响应体
- 所有接口返回统一结构,包含 code、message、data 字段,便于前端统一处理。
- 提供 OK、Fail、BadRequest、InternalError 等便捷函数。
章节来源
中间件链路
- Recovery:异常恢复。
- RequestID:注入请求 ID。
- Logger:记录请求日志,区分不同状态等级。
- CORS:跨域支持。
章节来源
数据库连接
- 使用标准库 database/sql 与 MySQL 驱动,设置连接池参数与超时。
- 通过配置生成 DSN 并 Ping 校验连通性。
章节来源
搜索引擎与缓存
- Meilisearch:按索引执行搜索,限制返回字段,解码为映射列表。
- Redis:按配置创建客户端,用于设备信息上报等场景。
章节来源
- internal/search/meilisearch.go:17-46
- internal/cache/redis.go:10-16
- internal/config/meilisearch.go:14-51
- internal/config/redis.go:16-57
依赖分析
- 运行时依赖:Gin、MySQL 驱动、Meilisearch SDK、Redis SDK、Zap 日志。
- 构建工具:Makefile 提供 run/build/test/tidy 命令。
- 版本要求:Go 1.24.0(go.mod 中声明),但 README 要求 1.22+。
graph LR
GO_MOD["go.mod"] --> Gin["github.com/gin-gonic/gin"]
GO_MOD --> MySQL["github.com/go-sql-driver/mysql"]
GO_MOD --> Meili["github.com/meilisearch/meilisearch-go"]
GO_MOD --> RedisSDK["github.com/redis/go-redis/v9"]
GO_MOD --> Zap["go.uber.org/zap"]
MK["Makefile"] --> Run["make run"]
MK --> Build["make build"]
MK --> Test["make test"]
MK --> Tidy["make tidy"]
图表来源
章节来源
性能考虑
- 数据库连接池:最大并发、空闲连接数与连接生命周期已设置,建议结合实际 QPS 调优。
- HTTP 超时:读取、写入、空闲超时已设定,可根据网络与硬件条件调整。
- 搜索引擎:限制 AttributesToRetrieve,减少传输与解析开销。
- 缓存:合理设置过期策略与键空间,避免热点键导致抖动。
故障排查指南
- 数据库连接失败
- 检查 DATABASE_HOST/DATABASE_PORT/DATABASE_NAME/DATABASE_USER/DATABASE_PASSWORD 是否正确。
- 生产环境必须提供 DATABASE_PASSWORD。
- 搜索引擎或缓存配置错误
- 确认 MEILISEARCH_HOST/API_KEY/INDEX 与 REDIS_* 配置完整。
- 健康检查失败
- 访问 /api/v1/health,确认返回状态 up。
- 品牌查询无结果
- 使用 /audio/getBrand?brandName=xxx 进行模糊查询,确认数据库中存在相关数据。
- 日志定位
- 中间件会记录请求状态、耗时、IP、请求 ID 等,便于问题追踪。
章节来源
- internal/config/database.go:57-72
- internal/config/meilisearch.go:39-51
- internal/config/redis.go:51-57
- internal/middleware/logger.go:10-46
结论
通过本指南,你可以完成环境准备、依赖安装、配置覆盖与运行验证。建议先在开发环境跑通健康检查与品牌查询,再逐步接入数据库、搜索引擎与缓存。生产环境务必通过环境变量提供敏感配置,避免硬编码。
附录
环境要求与安装
- 环境要求:Go 1.22+(仓库 go.mod 为 1.24.0,满足要求)
- 安装依赖:执行 go mod tidy
- 运行方式:make run 或 go run ./cmd/server
章节来源
配置与环境变量说明
- APP_ENV:运行环境(development/production)
- APP_HOST:监听地址
- APP_PORT:监听端口
- GIN_MODE:Gin 运行模式(debug/release)
- DATABASE_*:数据库连接(可覆盖默认值)
- MEILISEARCH_*:搜索引擎连接(可覆盖默认值)
- REDIS_*:缓存连接(可覆盖默认值)
章节来源
- README.md:39-45
- internal/config/config.go:18-56
- internal/config/database.go:17-72
- internal/config/meilisearch.go:14-51
- internal/config/redis.go:16-57
健康检查与基础接口示例
- 健康检查:GET /api/v1/health
- 品牌查询:GET /audio/getBrand
- 全量:GET /audio/getBrand
- 模糊:GET /audio/getBrand?brandName=xxx
章节来源
- README.md:83-109
- internal/router/router.go:27-38
- internal/handler/health.go:14-18
- internal/handler/brand.go:26-49
构建与运行
- 构建:make build,产物位于 bin/server
- 运行:make run 或 go run ./cmd/server
- 测试:make test
- 依赖整理:make tidy
章节来源