18 KiB
18 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/meilisearch.go](file://internal/config/meilisearch.go) - [internal/config/redis.go](file://internal/config/redis.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/handler/model.go](file://internal/handler/model.go) - [internal/handler/model_list.go](file://internal/handler/model_list.go) - [internal/handler/device.go](file://internal/handler/device.go) - [internal/middleware/logger.go](file://internal/middleware/logger.go) - [internal/middleware/cors.go](file://internal/middleware/cors.go) - [internal/middleware/request_id.go](file://internal/middleware/request_id.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/response/response.go](file://internal/response/response.go) - [pkg/logger/logger.go](file://pkg/logger/logger.go) - [go.mod](file://go.mod) - [README.md](file://README.md) - [Makefile](file://Makefile)目录
引言
本文件为 Luxsin 应用 API 项目的系统架构文档,聚焦于高层设计、架构模式与系统边界。项目采用分层架构(表现层、业务层、数据访问层、基础设施层),结合依赖注入、中间件与工厂等模式,形成清晰的职责划分与可维护性。系统围绕 Gin HTTP 框架构建,集成 MySQL、Redis 与 Meilisearch,提供健康检查、品牌与型号查询、设备信息上报以及模型检索等能力。
项目结构
项目采用按领域与层次混合的组织方式:
- cmd/server:程序入口,负责配置加载、资源初始化、HTTP 服务启动与优雅关闭
- internal:核心业务域
- config:集中式配置加载与校验
- router:路由注册与中间件装配
- handler:HTTP 处理器,面向具体接口
- middleware:横切关注点(日志、CORS、Request ID)
- database:数据库连接工厂与生命周期管理
- cache:Redis 客户端工厂
- search:Meilisearch 客户端与搜索逻辑
- response:统一响应体封装
- model/repository:模型与仓储抽象(当前未在路由中使用)
- pkg:可复用工具模块(日志封装)
- sql:数据库初始化脚本
- 根目录:构建与依赖声明
graph TB
subgraph "应用进程"
MAIN["cmd/server/main.go<br/>程序入口"]
ROUTER["internal/router/router.go<br/>路由与中间件"]
HANDLERS["internal/handler/*<br/>HTTP处理器"]
RESP["internal/response/response.go<br/>统一响应"]
end
subgraph "配置与基础设施"
CFG["internal/config/*.go<br/>配置加载/校验"]
LOGPKG["pkg/logger/logger.go<br/>日志封装"]
MYSQL["internal/database/mysql.go<br/>MySQL工厂"]
REDIS["internal/cache/redis.go<br/>Redis工厂"]
MS["internal/search/meilisearch.go<br/>Meilisearch客户端"]
end
MAIN --> CFG
MAIN --> MYSQL
MAIN --> REDIS
MAIN --> MS
MAIN --> ROUTER
ROUTER --> HANDLERS
HANDLERS --> RESP
MAIN --> LOGPKG
图表来源
- cmd/server/main.go:1-96
- internal/router/router.go:1-42
- internal/config/config.go:1-64
- pkg/logger/logger.go:1-20
- internal/database/mysql.go:1-47
- internal/cache/redis.go:1-17
- internal/search/meilisearch.go:1-46
- internal/response/response.go:1-37
章节来源
核心组件
- 配置中心:集中加载运行环境、主机、端口、数据库、搜索引擎与缓存参数,并进行必要校验
- 日志封装:按环境输出不同编码风格的日志,便于生产与开发调试
- 数据库工厂:构造 MySQL 连接池,设置连接上限、空闲数与生命周期,并进行超时探测
- 缓存工厂:构造 Redis 客户端实例
- 搜索引擎客户端:封装 Meilisearch 搜索请求,限定返回字段
- 路由与中间件:装配 Recovery、Request ID、Logger、CORS,并注册各业务路由
- HTTP 处理器:面向具体接口(健康检查、品牌、型号、模型列表、设备信息上报)
- 统一响应:标准化返回结构,简化错误码与消息传递
章节来源
- internal/config/config.go:18-56
- pkg/logger/logger.go:8-19
- internal/database/mysql.go:14-46
- internal/cache/redis.go:10-16
- internal/search/meilisearch.go:17-45
- internal/router/router.go:14-41
- internal/handler/health.go:14-18
- internal/response/response.go:9-36
架构总览
系统采用“入口—配置—基础设施—路由—处理器”的分层结构,入口负责组装依赖并通过工厂创建基础设施客户端,路由层装配中间件并注册业务接口,处理器层完成业务逻辑与数据访问。
graph TB
CLIENT["客户端/调用方"]
ENTRY["cmd/server/main.go<br/>启动与依赖注入"]
CONF["internal/config/*.go<br/>配置加载/校验"]
LOG["pkg/logger/logger.go<br/>日志"]
DBF["internal/database/mysql.go<br/>MySQL工厂"]
REDF["internal/cache/redis.go<br/>Redis工厂"]
MSF["internal/search/meilisearch.go<br/>Meilisearch工厂"]
RT["internal/router/router.go<br/>路由与中间件"]
H1["internal/handler/health.go"]
H2["internal/handler/brand.go"]
H3["internal/handler/model.go"]
H4["internal/handler/model_list.go"]
H5["internal/handler/device.go"]
CLIENT --> ENTRY
ENTRY --> CONF
ENTRY --> DBF
ENTRY --> REDF
ENTRY --> MSF
ENTRY --> LOG
ENTRY --> RT
RT --> H1
RT --> H2
RT --> H3
RT --> H4
RT --> H5
图表来源
- cmd/server/main.go:22-64
- internal/router/router.go:14-41
- internal/handler/health.go:10-18
- internal/handler/brand.go
- internal/handler/model.go
- internal/handler/model_list.go
- internal/handler/device.go
详细组件分析
入口与控制流(main)
- 加载配置并根据环境设置 Gin 运行模式
- 初始化日志、数据库、搜索引擎与缓存客户端
- 创建 Gin 引擎并启动 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 MS as "search.NewClient()"
participant RC as "cache.NewClient()"
participant RT as "router.New()"
OS->>Main : 启动进程
Main->>Cfg : 加载配置
Main->>Log : 初始化日志
Main->>DB : 打开数据库连接
Main->>MS : 初始化搜索引擎
Main->>RC : 初始化缓存
Main->>RT : 创建路由引擎
Main->>OS : 启动HTTP服务
图表来源
章节来源
配置加载与校验
- 从环境变量读取运行参数,支持默认值
- 分别加载数据库、搜索引擎与缓存配置并执行校验
- 提供 Addr() 计算监听地址
flowchart TD
Start(["启动"]) --> LoadEnv["读取环境变量"]
LoadEnv --> LoadDB["加载数据库配置并校验"]
LoadDB --> LoadMS["加载搜索引擎配置并校验"]
LoadMS --> LoadRD["加载Redis配置并校验"]
LoadRD --> BuildCfg["构建Config对象"]
BuildCfg --> End(["完成"])
图表来源
章节来源
路由与中间件
- 使用 Gin.New() 创建引擎,启用 Recovery
- 注册中间件:Request ID、Logger、CORS
- 注册业务路由分组与接口
sequenceDiagram
participant RT as "router.New()"
participant MW1 as "RequestID"
participant MW2 as "Logger"
participant MW3 as "CORS"
participant H as "handlers"
RT->>MW1 : Use(RequestID)
RT->>MW2 : Use(Logger)
RT->>MW3 : Use(CORS)
RT->>H : 注册健康检查/品牌/型号/模型列表/设备上报
图表来源
- internal/router/router.go:14-41
- internal/middleware/request_id.go:20-30
- internal/middleware/logger.go:10-45
- internal/middleware/cors.go:7-20
章节来源
- internal/router/router.go:14-41
- internal/middleware/request_id.go:10-31
- internal/middleware/logger.go:10-46
- internal/middleware/cors.go:7-21
数据访问层(数据库/缓存/搜索)
- 数据库:通过工厂函数创建 sql.DB,设置连接池参数并 Ping 校验
- 缓存:通过工厂函数创建 Redis 客户端
- 搜索:通过工厂函数创建 Meilisearch 客户端,提供模型列表检索
classDiagram
class DBFactory {
+Open(cfg) *sql.DB
}
class RedisFactory {
+NewClient(cfg) *redis.Client
}
class SearchClient {
+ModelList(ctx, key, count) []map[string]any
}
DBFactory --> "*sql.DB" : "创建"
RedisFactory --> "*redis.Client" : "创建"
SearchClient --> "meilisearch.IndexManager" : "封装"
图表来源
章节来源
处理器与统一响应
- 处理器:健康检查、品牌、型号、模型列表、设备信息上报
- 统一响应:OK/Fail/BadRequest/InternalError 等方法,保证返回结构一致
classDiagram
class Handler {
<<interface>>
+Check(c)
}
class BrandHandler {
+GetBrand(c)
}
class ModelHandler {
+GetModel(c)
}
class ModelListHandler {
+ModelList(c)
}
class DeviceHandler {
+ReportDevInfo(c)
}
class Response {
+OK(c,data)
+Fail(c,status,code,msg)
+BadRequest(c,msg)
+InternalError(c,msg)
}
Handler <|.. BrandHandler
Handler <|.. ModelHandler
Handler <|.. ModelListHandler
Handler <|.. DeviceHandler
BrandHandler --> Response : "使用"
ModelHandler --> Response : "使用"
ModelListHandler --> Response : "使用"
DeviceHandler --> Response : "使用"
图表来源
- internal/handler/health.go:8-18
- internal/handler/brand.go
- internal/handler/model.go
- internal/handler/model_list.go
- internal/handler/device.go
- internal/response/response.go:9-36
章节来源
关键流程示例:健康检查
- 请求进入 /api/v1/health
- 经过中间件链路后交由 HealthHandler 处理
- 使用统一响应返回状态
sequenceDiagram
participant C as "客户端"
participant G as "Gin引擎"
participant MW as "中间件链"
participant H as "HealthHandler"
participant R as "Response"
C->>G : GET /api/v1/health
G->>MW : 执行中间件
MW-->>G : 继续
G->>H : Check(c)
H->>R : OK(c, {status : "up"})
R-->>C : JSON响应
图表来源
- internal/router/router.go:27-30
- internal/handler/health.go:14-18
- internal/response/response.go:15-21
章节来源
- internal/router/router.go:27-30
- internal/handler/health.go:14-18
- internal/response/response.go:15-21
依赖关系分析
- 技术栈与版本
- Go 1.24.0
- Gin 1.10.0、MySQL Driver 1.10.0、Meilisearch Go SDK 0.36.2、Redis Go-Redis 9.19.0、Zap 1.27.0
- 间接依赖:大量通过 go.mod 标注的间接依赖,确保高性能与安全更新
- 版本兼容性:Go 1.24 与各依赖版本在 go.mod 中明确声明,遵循语义化版本
graph LR
GO["Go 1.24.0"]
GIN["Gin 1.10.0"]
MYSQLDRV["MySQL Driver 1.10.0"]
MS["Meilisearch SDK 0.36.2"]
REDIS["Redis Go-Redis 9.19.0"]
ZAP["Zap 1.27.0"]
GO --> GIN
GO --> MYSQLDRV
GO --> MS
GO --> REDIS
GO --> ZAP
图表来源
章节来源
性能考量
- 连接池与生命周期
- 数据库连接池:最大并发、空闲连接数与连接最长存活时间已设置,有助于控制资源占用与抖动
- Redis 客户端:通过工厂创建,建议在处理器中复用以减少连接开销
- 超时与稳定性
- HTTP 服务器设置读/写/空闲超时,避免慢请求导致资源泄漏
- 数据库 Ping 设置超时上下文,防止启动阻塞
- 日志级别与开销
- 生产环境使用生产配置,减少编码开销;开发环境彩色编码提升可观测性
- 搜索性能
- 搜索限制返回字段与数量,降低网络与解析成本
章节来源
- internal/database/mysql.go:33-43
- cmd/server/main.go:66-72
- pkg/logger/logger.go:10-17
- internal/search/meilisearch.go:22-29
故障排查指南
- 启动失败
- 检查配置加载是否成功(环境变量、默认值、校验)
- 查看数据库连接日志与错误信息
- 接口异常
- 通过 Request ID 定位请求链路
- 根据日志中的状态码、路径、延迟与错误信息定位问题
- 搜索无结果
- 确认索引与 API Key 配置正确
- 检查检索关键字与返回字段映射
- 缓存不可用
- 校验 Redis 地址、端口与认证信息
章节来源
- cmd/server/main.go:32-58
- internal/middleware/logger.go:10-45
- internal/middleware/request_id.go:20-30
- internal/search/meilisearch.go:17-20
- internal/cache/redis.go:10-16
结论
本项目通过清晰的分层架构与工厂/中间件/依赖注入模式,实现了高内聚、低耦合的服务结构。入口负责依赖装配,路由与中间件提供横切能力,处理器与统一响应保障接口一致性。结合数据库连接池、日志与超时策略,系统具备良好的性能与可维护性。后续可在安全、监控与灾备方面进一步增强。
附录
系统上下文图
graph TB
U["用户/客户端"]
S["应用进程"]
D["MySQL"]
K["Redis"]
E["Meilisearch"]
U --> S
S --> D
S --> K
S --> E
图表来源
- cmd/server/main.go:38-57
- internal/database/mysql.go:14-46
- internal/cache/redis.go:10-16
- internal/search/meilisearch.go:17-20
组件分解图
graph TB
MAIN["main.go"]
CFG["config/*.go"]
LOG["pkg/logger/logger.go"]
DB["internal/database/mysql.go"]
RC["internal/cache/redis.go"]
MS["internal/search/meilisearch.go"]
RT["internal/router/router.go"]
H["internal/handler/*"]
RESP["internal/response/response.go"]
MAIN --> CFG
MAIN --> LOG
MAIN --> DB
MAIN --> RC
MAIN --> MS
MAIN --> RT
RT --> H
H --> RESP
图表来源
部署拓扑与基础设施要求
- 运行环境:Go 1.24+
- 依赖服务:MySQL、Redis、Meilisearch
- 监听地址与端口:由配置决定,默认 0.0.0.0:8080
- 构建与运行:Makefile 提供 run/build/test/tidy 目标
章节来源