317 lines
13 KiB
Markdown
317 lines
13 KiB
Markdown
|
|
# 快速开始
|
|||
|
|
|
|||
|
|
<cite>
|
|||
|
|
**本文引用的文件**
|
|||
|
|
- [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)
|
|||
|
|
</cite>
|
|||
|
|
|
|||
|
|
## 目录
|
|||
|
|
1. [简介](#简介)
|
|||
|
|
2. [项目结构](#项目结构)
|
|||
|
|
3. [核心组件](#核心组件)
|
|||
|
|
4. [架构总览](#架构总览)
|
|||
|
|
5. [详细组件分析](#详细组件分析)
|
|||
|
|
6. [依赖分析](#依赖分析)
|
|||
|
|
7. [性能考虑](#性能考虑)
|
|||
|
|
8. [故障排查指南](#故障排查指南)
|
|||
|
|
9. [结论](#结论)
|
|||
|
|
10. [附录](#附录)
|
|||
|
|
|
|||
|
|
## 简介
|
|||
|
|
本指南面向新手开发者,帮助你在本地快速搭建 Luxsin 应用 API 的开发与运行环境。你将了解环境要求、依赖安装、配置设置(含 .env 示例)、开发与生产环境差异、数据库与搜索引擎/缓存连接配置,以及如何使用 Makefile 进行构建与运行。同时提供健康检查、品牌查询等基础接口的使用示例,确保你能顺利启动服务并验证功能。
|
|||
|
|
|
|||
|
|
## 项目结构
|
|||
|
|
项目采用分层与按功能模块组织的结构,核心入口在 cmd/server,配置、路由、处理器、中间件、数据库、缓存、搜索引擎、统一响应体等均按职责划分到 internal 与 pkg 下。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
图表来源
|
|||
|
|
- [cmd/server/main.go:1-96](file://cmd/server/main.go#L1-L96)
|
|||
|
|
- [internal/config/config.go:1-64](file://internal/config/config.go#L1-L64)
|
|||
|
|
- [internal/router/router.go:1-42](file://internal/router/router.go#L1-L42)
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [README.md:5-17](file://README.md#L5-L17)
|
|||
|
|
- [cmd/server/main.go:22-64](file://cmd/server/main.go#L22-L64)
|
|||
|
|
|
|||
|
|
## 核心组件
|
|||
|
|
- 入口程序:负责加载配置、初始化日志、数据库、搜索引擎与缓存客户端,创建路由并启动 HTTP 服务器。
|
|||
|
|
- 配置系统:集中读取环境变量,支持开发与生产环境默认值,以及通过 DATABASE_*、REDIS_*、MEILISEARCH_* 等前缀覆盖。
|
|||
|
|
- 路由与处理器:定义 /api/v1/health 与 /audio/* 等业务接口。
|
|||
|
|
- 统一响应体:规范所有接口返回结构,便于前端消费与错误处理。
|
|||
|
|
- 中间件:日志、CORS、请求 ID 等通用能力。
|
|||
|
|
- 数据库/搜索引擎/缓存:MySQL、Meilisearch、Redis 客户端初始化与校验。
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [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)
|
|||
|
|
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
|||
|
|
- [internal/response/response.go:9-37](file://internal/response/response.go#L9-L37)
|
|||
|
|
|
|||
|
|
## 架构总览
|
|||
|
|
下图展示了从入口到各子系统的调用关系与数据流。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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 : 统一响应体
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
图表来源
|
|||
|
|
- [cmd/server/main.go:22-64](file://cmd/server/main.go#L22-L64)
|
|||
|
|
- [internal/router/router.go:21-38](file://internal/router/router.go#L21-L38)
|
|||
|
|
- [internal/response/response.go:15-21](file://internal/response/response.go#L15-L21)
|
|||
|
|
|
|||
|
|
## 详细组件分析
|
|||
|
|
|
|||
|
|
### 启动流程与控制循环
|
|||
|
|
- 入口加载配置,按环境设置 Gin 模式。
|
|||
|
|
- 初始化日志、数据库、搜索引擎与缓存。
|
|||
|
|
- 创建 HTTP 服务器并启动协程监听。
|
|||
|
|
- 通过信号量优雅关闭,设置超时上下文。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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(["结束"])
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
图表来源
|
|||
|
|
- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96)
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96)
|
|||
|
|
|
|||
|
|
### 配置系统与环境变量
|
|||
|
|
- 关键变量
|
|||
|
|
- 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](file://internal/config/config.go#L18-L56)
|
|||
|
|
- [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72)
|
|||
|
|
- [internal/config/meilisearch.go:14-51](file://internal/config/meilisearch.go#L14-L51)
|
|||
|
|
- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57)
|
|||
|
|
- [README.md:39-45](file://README.md#L39-L45)
|
|||
|
|
- [README.md:46-56](file://README.md#L46-L56)
|
|||
|
|
|
|||
|
|
### 路由与接口
|
|||
|
|
- /api/v1/health:健康检查接口,返回状态 up。
|
|||
|
|
- /audio/getBrand:品牌列表查询,支持按 brandName 参数模糊过滤。
|
|||
|
|
- /audio/getModel:型号查询(具体参数与行为见处理器实现)。
|
|||
|
|
- /audio/modelList:基于搜索引擎的型号列表检索。
|
|||
|
|
- /audio/reportDevInfo:设备信息上报(具体参数与行为见处理器实现)。
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [internal/router/router.go:27-38](file://internal/router/router.go#L27-L38)
|
|||
|
|
- [internal/handler/health.go:14-18](file://internal/handler/health.go#L14-L18)
|
|||
|
|
- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
|||
|
|
|
|||
|
|
### 统一响应体
|
|||
|
|
- 所有接口返回统一结构,包含 code、message、data 字段,便于前端统一处理。
|
|||
|
|
- 提供 OK、Fail、BadRequest、InternalError 等便捷函数。
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [internal/response/response.go:9-37](file://internal/response/response.go#L9-L37)
|
|||
|
|
|
|||
|
|
### 中间件链路
|
|||
|
|
- Recovery:异常恢复。
|
|||
|
|
- RequestID:注入请求 ID。
|
|||
|
|
- Logger:记录请求日志,区分不同状态等级。
|
|||
|
|
- CORS:跨域支持。
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [internal/router/router.go:14-20](file://internal/router/router.go#L14-L20)
|
|||
|
|
- [internal/middleware/logger.go:10-46](file://internal/middleware/logger.go#L10-L46)
|
|||
|
|
|
|||
|
|
### 数据库连接
|
|||
|
|
- 使用标准库 database/sql 与 MySQL 驱动,设置连接池参数与超时。
|
|||
|
|
- 通过配置生成 DSN 并 Ping 校验连通性。
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46)
|
|||
|
|
- [internal/config/database.go:17-72](file://internal/config/database.go#L17-L72)
|
|||
|
|
|
|||
|
|
### 搜索引擎与缓存
|
|||
|
|
- Meilisearch:按索引执行搜索,限制返回字段,解码为映射列表。
|
|||
|
|
- Redis:按配置创建客户端,用于设备信息上报等场景。
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [internal/search/meilisearch.go:17-46](file://internal/search/meilisearch.go#L17-L46)
|
|||
|
|
- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16)
|
|||
|
|
- [internal/config/meilisearch.go:14-51](file://internal/config/meilisearch.go#L14-L51)
|
|||
|
|
- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57)
|
|||
|
|
|
|||
|
|
## 依赖分析
|
|||
|
|
- 运行时依赖:Gin、MySQL 驱动、Meilisearch SDK、Redis SDK、Zap 日志。
|
|||
|
|
- 构建工具:Makefile 提供 run/build/test/tidy 命令。
|
|||
|
|
- 版本要求:Go 1.24.0(go.mod 中声明),但 README 要求 1.22+。
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
图表来源
|
|||
|
|
- [go.mod:1-47](file://go.mod#L1-L47)
|
|||
|
|
- [Makefile:1-14](file://Makefile#L1-L14)
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [go.mod:1-47](file://go.mod#L1-L47)
|
|||
|
|
- [Makefile:1-14](file://Makefile#L1-L14)
|
|||
|
|
- [README.md:21-29](file://README.md#L21-L29)
|
|||
|
|
|
|||
|
|
## 性能考虑
|
|||
|
|
- 数据库连接池:最大并发、空闲连接数与连接生命周期已设置,建议结合实际 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](file://internal/config/database.go#L57-L72)
|
|||
|
|
- [internal/config/meilisearch.go:39-51](file://internal/config/meilisearch.go#L39-L51)
|
|||
|
|
- [internal/config/redis.go:51-57](file://internal/config/redis.go#L51-L57)
|
|||
|
|
- [internal/middleware/logger.go:10-46](file://internal/middleware/logger.go#L10-L46)
|
|||
|
|
|
|||
|
|
## 结论
|
|||
|
|
通过本指南,你可以完成环境准备、依赖安装、配置覆盖与运行验证。建议先在开发环境跑通健康检查与品牌查询,再逐步接入数据库、搜索引擎与缓存。生产环境务必通过环境变量提供敏感配置,避免硬编码。
|
|||
|
|
|
|||
|
|
## 附录
|
|||
|
|
|
|||
|
|
### 环境要求与安装
|
|||
|
|
- 环境要求:Go 1.22+(仓库 go.mod 为 1.24.0,满足要求)
|
|||
|
|
- 安装依赖:执行 go mod tidy
|
|||
|
|
- 运行方式:make run 或 go run ./cmd/server
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [README.md:21-29](file://README.md#L21-L29)
|
|||
|
|
- [go.mod:3](file://go.mod#L3)
|
|||
|
|
- [Makefile:3-4](file://Makefile#L3-L4)
|
|||
|
|
|
|||
|
|
### 配置与环境变量说明
|
|||
|
|
- APP_ENV:运行环境(development/production)
|
|||
|
|
- APP_HOST:监听地址
|
|||
|
|
- APP_PORT:监听端口
|
|||
|
|
- GIN_MODE:Gin 运行模式(debug/release)
|
|||
|
|
- DATABASE_*:数据库连接(可覆盖默认值)
|
|||
|
|
- MEILISEARCH_*:搜索引擎连接(可覆盖默认值)
|
|||
|
|
- REDIS_*:缓存连接(可覆盖默认值)
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [README.md:39-45](file://README.md#L39-L45)
|
|||
|
|
- [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/meilisearch.go:14-51](file://internal/config/meilisearch.go#L14-L51)
|
|||
|
|
- [internal/config/redis.go:16-57](file://internal/config/redis.go#L16-L57)
|
|||
|
|
|
|||
|
|
### 健康检查与基础接口示例
|
|||
|
|
- 健康检查:GET /api/v1/health
|
|||
|
|
- 品牌查询:GET /audio/getBrand
|
|||
|
|
- 全量:GET /audio/getBrand
|
|||
|
|
- 模糊:GET /audio/getBrand?brandName=xxx
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [README.md:83-109](file://README.md#L83-L109)
|
|||
|
|
- [internal/router/router.go:27-38](file://internal/router/router.go#L27-L38)
|
|||
|
|
- [internal/handler/health.go:14-18](file://internal/handler/health.go#L14-L18)
|
|||
|
|
- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
|||
|
|
|
|||
|
|
### 构建与运行
|
|||
|
|
- 构建:make build,产物位于 bin/server
|
|||
|
|
- 运行:make run 或 go run ./cmd/server
|
|||
|
|
- 测试:make test
|
|||
|
|
- 依赖整理:make tidy
|
|||
|
|
|
|||
|
|
章节来源
|
|||
|
|
- [Makefile:1-14](file://Makefile#L1-L14)
|
|||
|
|
- [README.md:117-122](file://README.md#L117-L122)
|