更新 wiki
This commit is contained in:
@@ -7,18 +7,34 @@
|
||||
- [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/config/s3.go](file://internal/config/s3.go)
|
||||
- [internal/cache/redis.go](file://internal/cache/redis.go)
|
||||
- [internal/cache/curve_cache.go](file://internal/cache/curve_cache.go)
|
||||
- [internal/cache/share_code_cache.go](file://internal/cache/share_code_cache.go)
|
||||
- [internal/search/meilisearch.go](file://internal/search/meilisearch.go)
|
||||
- [internal/database/mysql.go](file://internal/database/mysql.go)
|
||||
- [internal/router/router.go](file://internal/router/router.go)
|
||||
- [internal/middleware/cache_control.go](file://internal/middleware/cache_control.go)
|
||||
- [internal/middleware/logger.go](file://internal/middleware/logger.go)
|
||||
- [internal/middleware/request_id.go](file://internal/middleware/request_id.go)
|
||||
- [internal/handler/model_list.go](file://internal/handler/model_list.go)
|
||||
- [internal/handler/model_csv.go](file://internal/handler/model_csv.go)
|
||||
- [internal/handler/curve.go](file://internal/handler/curve.go)
|
||||
- [internal/repository/model.go](file://internal/repository/model.go)
|
||||
- [internal/storage/s3.go](file://internal/storage/s3.go)
|
||||
- [pkg/logger/logger.go](file://pkg/logger/logger.go)
|
||||
- [README.md](file://README.md)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**所做更改**
|
||||
- 新增 S3 存储支持章节,介绍 AWS S3 集成与 CSV 数据读取
|
||||
- 增强缓存控制中间件章节,详细说明 HTTP 缓存策略配置
|
||||
- 改进日志系统章节,更新日志配置与中间件功能
|
||||
- 更新基础设施架构图,反映新增的 S3 组件
|
||||
- 新增 S3 存储与缓存控制中间件的使用示例
|
||||
- 更新配置清单,包含 S3 相关配置项
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
@@ -32,14 +48,14 @@
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件聚焦于 Luxsin 应用 API 的基础设施组件,系统性阐述缓存系统(Redis)、搜索引擎(Meilisearch)与日志系统(Zap)的配置、初始化流程、连接管理、配置项与运行时行为,并结合实际代码路径说明组件间的协作关系与数据流向。同时提供性能优化建议、监控告警与扩展性设计思路、安全注意事项以及可操作的排障指引。
|
||||
本文件聚焦于 Luxsin 应用 API 的基础设施组件,系统性阐述缓存系统(Redis)、搜索引擎(Meilisearch)、日志系统(Zap)与新增的 S3 存储系统的配置、初始化流程、连接管理、配置项与运行时行为,并结合实际代码路径说明组件间的协作关系与数据流向。同时提供性能优化建议、监控告警与扩展性设计思路、安全注意事项以及可操作的排障指引。
|
||||
|
||||
## 项目结构
|
||||
应用采用分层与按功能模块划分的组织方式:
|
||||
- 入口层:cmd/server/main.go 负责加载配置、初始化日志、数据库、搜索引擎与缓存客户端,并启动 HTTP 服务。
|
||||
- 配置层:internal/config/* 提供配置加载与校验逻辑,支持从环境变量或默认值读取数据库、Redis、Meilisearch 参数。
|
||||
- 基础设施接入:internal/database/mysql.go、internal/cache/redis.go、internal/search/meilisearch.go 封装底层驱动与 SDK 初始化。
|
||||
- Web 层:internal/router/router.go 注册路由与中间件;internal/middleware/* 提供请求 ID、日志与 CORS 中间件。
|
||||
- 入口层:cmd/server/main.go 负责加载配置、初始化日志、数据库、搜索引擎、缓存客户端与 S3 存储,并启动 HTTP 服务。
|
||||
- 配置层:internal/config/* 提供配置加载与校验逻辑,支持从环境变量或默认值读取数据库、Redis、Meilisearch、S3 参数。
|
||||
- 基础设施接入:internal/database/mysql.go、internal/cache/redis.go、internal/search/meilisearch.go、internal/storage/s3.go 封装底层驱动与 SDK 初始化。
|
||||
- Web 层:internal/router/router.go 注册路由与中间件;internal/middleware/* 提供请求 ID、日志、CORS 与缓存控制中间件。
|
||||
- 业务处理:internal/handler/* 与 internal/repository/* 实现具体业务逻辑。
|
||||
- 日志封装:pkg/logger/logger.go 提供生产/开发两种日志配置。
|
||||
|
||||
@@ -50,26 +66,27 @@ main --> logpkg["pkg/logger/logger.go<br/>日志初始化"]
|
||||
main --> dbinit["internal/database/mysql.go<br/>数据库初始化"]
|
||||
main --> msinit["internal/search/meilisearch.go<br/>搜索引擎初始化"]
|
||||
main --> rdinit["internal/cache/redis.go<br/>缓存初始化"]
|
||||
main --> s3init["internal/storage/s3.go<br/>S3存储初始化"]
|
||||
main --> router["internal/router/router.go<br/>路由与中间件"]
|
||||
router --> cachecontrol["internal/middleware/cache_control.go<br/>缓存控制中间件"]
|
||||
router --> handlers["internal/handler/*<br/>处理器"]
|
||||
handlers --> repos["internal/repository/*<br/>仓储层"]
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96)
|
||||
- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52)
|
||||
- [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46)
|
||||
- [internal/search/meilisearch.go:17-20](file://internal/search/meilisearch.go#L17-L20)
|
||||
- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
- [internal/storage/s3.go:20-39](file://internal/storage/s3.go#L20-L39)
|
||||
- [internal/router/router.go:22-82](file://internal/router/router.go#L22-L82)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
|
||||
章节来源
|
||||
- [cmd/server/main.go:22-96](file://cmd/server/main.go#L22-L96)
|
||||
- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
**章节来源**
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
- [internal/router/router.go:22-82](file://internal/router/router.go#L22-L82)
|
||||
|
||||
## 核心组件
|
||||
本节概述三大基础设施组件的职责、初始化与配置要点。
|
||||
本节概述四大基础设施组件的职责、初始化与配置要点。
|
||||
|
||||
- Redis 缓存
|
||||
- 职责:提供键值存储能力,用于热点数据缓存、会话或临时状态存储。
|
||||
@@ -88,16 +105,24 @@ handlers --> repos["internal/repository/*<br/>仓储层"]
|
||||
- 初始化:入口处按环境创建日志实例;中间件在每次请求结束时输出请求级日志。
|
||||
- 关键配置:环境变量控制生产/开发模式,时间编码等细节可定制。
|
||||
|
||||
章节来源
|
||||
- S3 存储
|
||||
- 职责:提供对象存储能力,用于频响 CSV 数据的存储与读取。
|
||||
- 初始化:根据环境变量加载 AWS 凭证与区域配置,创建 S3 客户端。
|
||||
- 关键配置:桶名、区域、访问密钥 ID、秘密访问密钥。
|
||||
- 使用场景:曲线数据读取、CSV 文件存储与访问。
|
||||
|
||||
**章节来源**
|
||||
- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16)
|
||||
- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56)
|
||||
- [internal/search/meilisearch.go:17-45](file://internal/search/meilisearch.go#L17-L45)
|
||||
- [internal/config/meilisearch.go:14-50](file://internal/config/meilisearch.go#L14-L50)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/storage/s3.go:20-39](file://internal/storage/s3.go#L20-L39)
|
||||
- [internal/config/s3.go:12-36](file://internal/config/s3.go#L12-L36)
|
||||
|
||||
## 架构总览
|
||||
下图展示应用启动阶段如何初始化三大基础设施,并在运行期如何被业务层调用。
|
||||
下图展示应用启动阶段如何初始化四大基础设施,并在运行期如何被业务层调用。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
@@ -107,24 +132,27 @@ participant Log as "日志(pkg/logger)"
|
||||
participant DB as "数据库(mysql.go)"
|
||||
participant MS as "搜索引擎(meilisearch.go)"
|
||||
participant RD as "缓存(redis.go)"
|
||||
participant S3 as "S3存储(s3.go)"
|
||||
participant Router as "路由(router.go)"
|
||||
Entrypoint->>Cfg : 加载配置
|
||||
Entrypoint->>Log : 创建日志实例
|
||||
Entrypoint->>DB : 初始化数据库连接
|
||||
Entrypoint->>MS : 初始化搜索引擎客户端
|
||||
Entrypoint->>RD : 初始化缓存客户端
|
||||
Entrypoint->>S3 : 初始化S3存储客户端
|
||||
Entrypoint->>Router : 注册路由与中间件
|
||||
Router-->>Entrypoint : 返回 HTTP 引擎
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [cmd/server/main.go:22-64](file://cmd/server/main.go#L22-L64)
|
||||
- [internal/config/config.go:18-52](file://internal/config/config.go#L18-L52)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:41-110](file://cmd/server/main.go#L41-L110)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
- [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46)
|
||||
- [internal/search/meilisearch.go:17-20](file://internal/search/meilisearch.go#L17-L20)
|
||||
- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
- [internal/storage/s3.go:20-39](file://internal/storage/s3.go#L20-L39)
|
||||
- [internal/router/router.go:22-82](file://internal/router/router.go#L22-L82)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
@@ -155,15 +183,15 @@ ReturnCache --> End(["完成"])
|
||||
ReturnResult --> End
|
||||
```
|
||||
|
||||
图示来源
|
||||
**图表来源**
|
||||
- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16)
|
||||
- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56)
|
||||
- [cmd/server/main.go:56-57](file://cmd/server/main.go#L56-L57)
|
||||
- [cmd/server/main.go:74-80](file://cmd/server/main.go#L74-L80)
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [internal/cache/redis.go:10-16](file://internal/cache/redis.go#L10-L16)
|
||||
- [internal/config/redis.go:16-56](file://internal/config/redis.go#L16-L56)
|
||||
- [cmd/server/main.go:56-57](file://cmd/server/main.go#L56-L57)
|
||||
- [cmd/server/main.go:74-80](file://cmd/server/main.go#L74-L80)
|
||||
|
||||
### Meilisearch 搜索组件
|
||||
- 初始化流程
|
||||
@@ -192,14 +220,14 @@ Search-->>Handler : 列表
|
||||
Handler-->>Client : JSON 或 Base64 响应
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [internal/handler/model_list.go:26-56](file://internal/handler/model_list.go#L26-L56)
|
||||
**图表来源**
|
||||
- [internal/handler/model_list.go:26-67](file://internal/handler/model_list.go#L26-L67)
|
||||
- [internal/search/meilisearch.go:22-45](file://internal/search/meilisearch.go#L22-L45)
|
||||
- [internal/config/meilisearch.go:14-50](file://internal/config/meilisearch.go#L14-L50)
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [internal/search/meilisearch.go:17-45](file://internal/search/meilisearch.go#L17-L45)
|
||||
- [internal/handler/model_list.go:26-56](file://internal/handler/model_list.go#L26-L56)
|
||||
- [internal/handler/model_list.go:26-67](file://internal/handler/model_list.go#L26-L67)
|
||||
- [internal/config/meilisearch.go:14-50](file://internal/config/meilisearch.go#L14-L50)
|
||||
|
||||
### 日志系统(Zap)
|
||||
@@ -226,16 +254,95 @@ LogWarn --> End
|
||||
LogInfo --> End
|
||||
```
|
||||
|
||||
图示来源
|
||||
**图表来源**
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
|
||||
### S3 存储组件
|
||||
- 初始化流程
|
||||
- 根据环境变量加载 AWS 凭证与区域配置,创建 S3 客户端实例。
|
||||
- 支持从环境变量或默认值读取桶名和区域配置。
|
||||
- 配置管理
|
||||
- 开发环境支持静态凭证配置,生产环境使用 IAM 角色或环境变量。
|
||||
- 自动加载 AWS 默认配置,支持自定义区域与凭据提供程序。
|
||||
- 数据访问
|
||||
- 提供 GetObject 方法读取对象内容,自动处理响应体关闭与错误处理。
|
||||
- 支持 CSV 数据解析与频响数据读取。
|
||||
- 使用场景
|
||||
- 频响 CSV 数据存储与读取。
|
||||
- 目标曲线 CSV 数据访问。
|
||||
- 支持 Eafonyoung 源的 CSV 数据处理。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start(["应用启动"]) --> LoadS3Cfg["加载 S3 配置"]
|
||||
LoadS3Cfg --> CheckCreds{"检查 AWS 凭证"}
|
||||
CheckCreds --> |有凭据| StaticCreds["使用静态凭据"]
|
||||
CheckCreds --> |无凭据| EnvCreds["使用环境变量"]
|
||||
StaticCreds --> BuildCfg["构建 AWS 配置"]
|
||||
EnvCreds --> BuildCfg
|
||||
BuildCfg --> NewClient["创建 S3 客户端"]
|
||||
NewClient --> Inject["注入到处理器/服务"]
|
||||
Inject --> UseCase{"是否需要读取 CSV?"}
|
||||
UseCase --> |是| GetObject["GetObject(key)"]
|
||||
UseCase --> |否| Idle["等待请求"]
|
||||
GetObject --> ParseCSV["解析 CSV 数据"]
|
||||
ParseCSV --> ReturnData["返回频响数据"]
|
||||
ReturnData --> End(["完成"])
|
||||
Idle --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [internal/storage/s3.go:20-56](file://internal/storage/s3.go#L20-L56)
|
||||
- [internal/config/s3.go:12-36](file://internal/config/s3.go#L12-L36)
|
||||
- [cmd/server/main.go:100-107](file://cmd/server/main.go#L100-L107)
|
||||
|
||||
**章节来源**
|
||||
- [internal/storage/s3.go:20-56](file://internal/storage/s3.go#L20-L56)
|
||||
- [internal/config/s3.go:12-36](file://internal/config/s3.go#L12-L36)
|
||||
- [cmd/server/main.go:100-107](file://cmd/server/main.go#L100-L107)
|
||||
|
||||
### 缓存控制中间件
|
||||
- 功能特性
|
||||
- 提供 HTTP 缓存控制头部设置,支持 public、private、no-cache 等指令。
|
||||
- 配置不同路由的缓存策略,优化静态资源与动态内容的缓存效果。
|
||||
- 设置 Vary 头部处理内容编码差异。
|
||||
- 缓存策略配置
|
||||
- CacheControlList:公共缓存,5分钟最大年龄,30分钟共享缓存,60秒回退验证。
|
||||
- CacheControlCurve:曲线数据缓存,5分钟最大年龄,1小时共享缓存,120秒回退验证。
|
||||
- CacheControlModelList:模型列表缓存,30秒最大年龄,300秒共享缓存,30秒回退验证。
|
||||
- 使用方式
|
||||
- 在路由注册时应用中间件,为不同接口设置合适的缓存策略。
|
||||
- 支持 Base64 响应的缓存控制,确保缓存一致性。
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Request["HTTP 请求"] --> ApplyMiddleware["应用缓存控制中间件"]
|
||||
ApplyMiddleware --> SetHeaders["设置 Cache-Control 头部"]
|
||||
SetHeaders --> SetVary["设置 Vary: Accept-Encoding"]
|
||||
SetVary --> NextHandler["调用下一个处理器"]
|
||||
NextHandler --> Response["生成响应"]
|
||||
Response --> Cacheable{"响应可缓存?"}
|
||||
Cacheable --> |是| ClientCache["客户端/代理缓存"]
|
||||
Cacheable --> |否| DirectResp["直接响应"]
|
||||
ClientCache --> End["完成"]
|
||||
DirectResp --> End
|
||||
```
|
||||
|
||||
**图表来源**
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
- [internal/router/router.go:65-77](file://internal/router/router.go#L65-L77)
|
||||
|
||||
**章节来源**
|
||||
- [internal/middleware/cache_control.go:5-17](file://internal/middleware/cache_control.go#L5-L17)
|
||||
- [internal/router/router.go:65-77](file://internal/router/router.go#L65-L77)
|
||||
|
||||
### 数据库(MySQL)与缓存/搜索的协作
|
||||
- 数据库连接
|
||||
- 初始化时设置最大打开连接数、最大空闲连接数与连接最大生命周期,并进行超时探测。
|
||||
@@ -259,25 +366,44 @@ Handler->>RD : 写入/读取缓存可选
|
||||
Handler->>MS : 全文搜索可选
|
||||
```
|
||||
|
||||
图示来源
|
||||
**图表来源**
|
||||
- [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46)
|
||||
- [internal/repository/model.go:20-61](file://internal/repository/model.go#L20-L61)
|
||||
- [internal/handler/model_list.go:26-56](file://internal/handler/model_list.go#L26-L56)
|
||||
- [internal/handler/model_list.go:26-67](file://internal/handler/model_list.go#L26-L67)
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [internal/database/mysql.go:14-46](file://internal/database/mysql.go#L14-L46)
|
||||
- [internal/repository/model.go:20-61](file://internal/repository/model.go#L20-L61)
|
||||
|
||||
### S3 存储与缓存控制中间件的使用示例
|
||||
- CSV 数据读取
|
||||
- 使用 ModelCSVHandler 读取频响 CSV 数据。
|
||||
- 支持 Base64 响应编码,适用于移动应用传输。
|
||||
- 自动处理 CSV 解析和数据验证。
|
||||
- 曲线数据处理
|
||||
- 在 CurveHandler 中集成 S3 CSV 读取功能。
|
||||
- 支持 Eafonyoung 源的 CSV 数据处理。
|
||||
- 实现 CSV 数据的缓存与复用。
|
||||
- 缓存策略应用
|
||||
- 在路由层为 CSV 接口应用合适的缓存控制策略。
|
||||
- 确保 Base64 响应的缓存一致性。
|
||||
|
||||
**章节来源**
|
||||
- [internal/handler/model_csv.go:30-102](file://internal/handler/model_csv.go#L30-L102)
|
||||
- [internal/handler/curve.go:491-509](file://internal/handler/curve.go#L491-L509)
|
||||
- [internal/storage/s3.go:41-56](file://internal/storage/s3.go#L41-L56)
|
||||
|
||||
## 依赖分析
|
||||
- 组件耦合
|
||||
- 入口层集中初始化三大基础设施并向路由层注入。
|
||||
- 处理器通过依赖注入的方式使用数据库、搜索引擎与缓存客户端。
|
||||
- 入口层集中初始化四大基础设施并向路由层注入。
|
||||
- 处理器通过依赖注入的方式使用数据库、搜索引擎、缓存客户端与 S3 存储。
|
||||
- 外部依赖
|
||||
- Gin:Web 框架与路由。
|
||||
- go-sql-driver/mysql:MySQL 驱动。
|
||||
- redis/go-redis/v9:Redis 客户端。
|
||||
- meilisearch/meilisearch-go:Meilisearch 客户端。
|
||||
- zap:结构化日志。
|
||||
- aws-sdk-go-v2:AWS SDK,用于 S3 存储。
|
||||
- 潜在循环依赖
|
||||
- 当前结构清晰,无明显循环导入。
|
||||
|
||||
@@ -288,17 +414,19 @@ Entrypoint --> Zap["Zap 日志"]
|
||||
Entrypoint --> MySQL["MySQL 驱动"]
|
||||
Entrypoint --> Redis["Redis 客户端"]
|
||||
Entrypoint --> Meili["Meilisearch 客户端"]
|
||||
Entrypoint --> S3["S3 存储"]
|
||||
Gin --> Handlers["处理器"]
|
||||
Handlers --> Repos["仓储"]
|
||||
Handlers --> S3Storage["S3 存储"]
|
||||
```
|
||||
|
||||
图示来源
|
||||
- [cmd/server/main.go:22-64](file://cmd/server/main.go#L22-L64)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:38-110](file://cmd/server/main.go#L38-L110)
|
||||
- [internal/router/router.go:22-82](file://internal/router/router.go#L22-L82)
|
||||
|
||||
章节来源
|
||||
- [cmd/server/main.go:22-64](file://cmd/server/main.go#L22-L64)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
**章节来源**
|
||||
- [cmd/server/main.go:38-110](file://cmd/server/main.go#L38-L110)
|
||||
- [internal/router/router.go:22-82](file://internal/router/router.go#L22-L82)
|
||||
|
||||
## 性能考量
|
||||
- Redis
|
||||
@@ -312,9 +440,14 @@ Handlers --> Repos["仓储"]
|
||||
- 日志
|
||||
- 生产环境建议异步落盘或使用缓冲队列,避免阻塞请求。
|
||||
- 控制日志字段数量,避免过度编码。
|
||||
- 数据库
|
||||
- 已设置连接池参数与生命周期,建议结合压测调整最大连接数与空闲连接数。
|
||||
- 对复杂查询添加索引,避免全表扫描。
|
||||
- S3 存储
|
||||
- 配置适当的连接超时与重试策略,避免长时间阻塞。
|
||||
- 对频繁访问的 CSV 文件考虑在应用层增加缓存。
|
||||
- 使用分块上传处理大文件,提高传输效率。
|
||||
- 缓存控制
|
||||
- 根据内容特性和访问模式选择合适的缓存策略。
|
||||
- 定期监控缓存命中率,调整缓存时间和策略。
|
||||
- 注意 Base64 响应的缓存一致性问题。
|
||||
|
||||
## 故障排除指南
|
||||
- Redis
|
||||
@@ -328,17 +461,24 @@ Handlers --> Repos["仓储"]
|
||||
- 日志
|
||||
- 症状:日志缺失或格式异常。
|
||||
- 排查:确认环境变量与日志配置;检查中间件是否正确挂载。
|
||||
- 数据库
|
||||
- 症状:连接超时或连接池耗尽。
|
||||
- 排查:核对连接参数与密码;检查最大连接数与空闲连接数设置;查看慢查询日志。
|
||||
- S3 存储
|
||||
- 症状:CSV 文件读取失败或权限错误。
|
||||
- 排查:确认 AWS 凭证配置正确;检查桶权限与对象存在性;验证区域设置。
|
||||
- 建议:增加重试机制和详细的错误日志。
|
||||
- 缓存控制
|
||||
- 症状:缓存策略不生效或缓存污染。
|
||||
- 排查:检查中间件应用顺序;验证 Cache-Control 头部设置;确认 Vary 头部配置。
|
||||
- 建议:使用浏览器开发者工具检查响应头,确保缓存策略正确应用。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [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/database/mysql.go:33-35](file://internal/database/mysql.go#L33-L35)
|
||||
- [internal/storage/s3.go:41-56](file://internal/storage/s3.go#L41-L56)
|
||||
- [internal/middleware/cache_control.go:5-17](file://internal/middleware/cache_control.go#L5-L17)
|
||||
|
||||
## 结论
|
||||
本项目在基础设施层面实现了清晰的分层与职责分离:入口集中初始化、配置统一加载、日志结构化输出、数据库与搜索引擎按需接入。当前代码已具备可扩展的基础,建议在 Redis 与搜索层面补充连接池与缓存策略,在日志层面增强异步与采样能力,并完善监控与告警体系以支撑生产环境的稳定性与可观测性。
|
||||
本项目在基础设施层面实现了清晰的分层与职责分离:入口集中初始化、配置统一加载、日志结构化输出、数据库与搜索引擎按需接入、S3 存储支持。当前代码已具备可扩展的基础,建议在 Redis 与搜索层面补充连接池与缓存策略,在日志层面增强异步与采样能力,并完善监控与告警体系以支撑生产环境的稳定性与可观测性。新增的 S3 存储为频响数据提供了可靠的云端存储解决方案,配合缓存控制中间件可以有效提升用户体验。
|
||||
|
||||
## 附录
|
||||
|
||||
@@ -353,31 +493,62 @@ Handlers --> Repos["仓储"]
|
||||
- 支持通过 REDIS_HOST/PORT/DATABASE/PASSWORD 覆盖默认值。
|
||||
- Meilisearch 配置
|
||||
- 支持通过 MEILISEARCH_HOST/API_KEY/INDEX 覆盖默认值。
|
||||
- S3 配置
|
||||
- 支持通过 S3_BUCKET/AWS_REGION/AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY 覆盖默认值。
|
||||
- 开发环境可使用静态凭证,生产环境建议使用 IAM 角色或环境变量。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [README.md:39-73](file://README.md#L39-L73)
|
||||
- [internal/config/database.go:17-55](file://internal/config/database.go#L17-L55)
|
||||
- [internal/config/redis.go:16-48](file://internal/config/redis.go#L16-L48)
|
||||
- [internal/config/meilisearch.go:14-36](file://internal/config/meilisearch.go#L14-L36)
|
||||
- [internal/config/s3.go:12-36](file://internal/config/s3.go#L12-L36)
|
||||
|
||||
### 最佳实践
|
||||
- 安全
|
||||
- 生产环境敏感配置(数据库密码、搜索引擎密钥)务必通过环境变量注入。
|
||||
- 生产环境敏感配置(数据库密码、搜索引擎密钥、S3 凭证)务必通过环境变量注入。
|
||||
- Redis 与 Meilisearch 建议启用鉴权与网络隔离。
|
||||
- S3 存储建议使用 IAM 角色和最小权限原则。
|
||||
- 可靠性
|
||||
- 为 Redis、数据库与搜索引擎增加健康检查与熔断策略。
|
||||
- 为 Redis、数据库、搜索引擎与 S3 增加健康检查与熔断策略。
|
||||
- 对外部依赖调用增加超时与重试。
|
||||
- S3 操作增加重试机制和错误处理。
|
||||
- 可观测性
|
||||
- 结合请求 ID 串联日志、指标与链路追踪。
|
||||
- 对关键路径埋点,关注延迟分布与错误率。
|
||||
- 监控 S3 存储的访问模式和成本。
|
||||
- 缓存策略
|
||||
- 根据内容特性和访问模式选择合适的缓存策略。
|
||||
- 定期监控缓存命中率,调整缓存时间和策略。
|
||||
- 注意不同接口的缓存控制策略差异。
|
||||
|
||||
### 扩展性设计
|
||||
- 缓存层
|
||||
- 引入多级缓存(本地 LRU + 远端 Redis)与失效策略。
|
||||
- 对热点数据预热与定期刷新。
|
||||
- 增加缓存统计与监控。
|
||||
- 搜索层
|
||||
- 建立索引更新流水线,保证数据一致性。
|
||||
- 引入搜索结果缓存与冷热数据分离。
|
||||
- 日志与监控
|
||||
- 增加指标采集(QPS、P95/P99、错误率)与告警阈值。
|
||||
- 使用分布式追踪定位慢调用。
|
||||
- 使用分布式追踪定位慢调用。
|
||||
- 存储层
|
||||
- 考虑引入 CDN 加速静态资源访问。
|
||||
- 对 S3 存储增加版本控制和生命周期管理。
|
||||
- 实现存储成本优化策略。
|
||||
|
||||
### S3 存储使用示例
|
||||
- CSV 数据读取
|
||||
- 使用 ModelCSVHandler 读取频响 CSV 数据。
|
||||
- 支持 Base64 响应编码,适用于移动应用传输。
|
||||
- 自动处理 CSV 解析和数据验证。
|
||||
- 曲线数据处理
|
||||
- 在 CurveHandler 中集成 S3 CSV 读取功能。
|
||||
- 支持 Eafonyoung 源的 CSV 数据处理。
|
||||
- 实现 CSV 数据的缓存与复用。
|
||||
|
||||
**章节来源**
|
||||
- [internal/handler/model_csv.go:30-102](file://internal/handler/model_csv.go#L30-L102)
|
||||
- [internal/handler/curve.go:491-509](file://internal/handler/curve.go#L491-L509)
|
||||
- [internal/storage/s3.go:41-56](file://internal/storage/s3.go#L41-L56)
|
||||
@@ -5,6 +5,7 @@
|
||||
- [pkg/logger/logger.go](file://pkg/logger/logger.go)
|
||||
- [internal/middleware/logger.go](file://internal/middleware/logger.go)
|
||||
- [internal/middleware/request_id.go](file://internal/middleware/request_id.go)
|
||||
- [internal/middleware/cache_control.go](file://internal/middleware/cache_control.go)
|
||||
- [cmd/server/main.go](file://cmd/server/main.go)
|
||||
- [internal/router/router.go](file://internal/router/router.go)
|
||||
- [internal/handler/device.go](file://internal/handler/device.go)
|
||||
@@ -14,6 +15,14 @@
|
||||
- [go.mod](file://go.mod)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**变更内容**
|
||||
- 新增缓存控制中间件的日志集成
|
||||
- 增强健康检查路由的日志优化
|
||||
- 扩展启动阶段的日志记录范围
|
||||
- 完善缓存预热功能的日志记录
|
||||
- 更新中间件注册顺序和配置
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
@@ -27,25 +36,26 @@
|
||||
10. [结论](#结论)
|
||||
|
||||
## 简介
|
||||
本文件面向 Luxsin 应用 API 项目的日志系统,围绕基于 Zap 的结构化日志进行系统性梳理。内容覆盖日志客户端初始化流程、配置选项与输出格式、日志级别使用场景、在中间件与处理器中的使用方式、以及与配置加载、请求链路追踪的集成。同时给出日志聚合、监控告警与故障排查的实践建议,帮助开发者建立完善且可维护的日志体系。
|
||||
本文件面向 Luxsin 应用 API 项目的日志系统,围绕基于 Zap 的结构化日志进行系统性梳理。内容覆盖日志客户端初始化流程、配置选项与输出格式、日志级别使用场景、在中间件与处理器中的使用方式、以及与配置加载、请求链路追踪的集成。特别关注新增的缓存控制中间件日志集成、健康检查路由优化和启动阶段的增强日志记录。同时给出日志聚合、监控告警与故障排查的实践建议,帮助开发者建立完善且可维护的日志体系。
|
||||
|
||||
## 项目结构
|
||||
日志系统在本项目中采用分层设计:
|
||||
- 初始化层:在服务启动时根据环境变量创建全局日志器。
|
||||
- 中间件层:统一记录请求生命周期的关键指标,按状态码选择日志级别。
|
||||
- 中间件层:统一记录请求生命周期的关键指标,按状态码选择日志级别,新增缓存控制中间件集成。
|
||||
- 处理器层:在业务逻辑中记录关键事件与错误,携带上下文信息。
|
||||
- 配置层:通过环境变量控制运行模式与端口等,间接影响日志输出风格。
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "启动阶段"
|
||||
MAIN["cmd/server/main.go<br/>读取配置/创建日志器"]
|
||||
MAIN["cmd/server/main.go<br/>读取配置/创建日志器<br/>缓存预热/定时任务"]
|
||||
CFG["internal/config/config.go<br/>环境与端口配置"]
|
||||
end
|
||||
subgraph "中间件层"
|
||||
REQID["internal/middleware/request_id.go<br/>生成/透传请求ID"]
|
||||
LOGMW["internal/middleware/logger.go<br/>请求日志中间件"]
|
||||
ROUTER["internal/router/router.go<br/>注册中间件与路由"]
|
||||
LOGMW["internal/middleware/logger.go<br/>请求日志中间件<br/>健康检查优化"]
|
||||
CACHE["internal/middleware/cache_control.go<br/>缓存控制中间件<br/>不同路由策略"]
|
||||
ROUTER["internal/router/router.go<br/>注册中间件与路由<br/>缓存控制集成"]
|
||||
end
|
||||
subgraph "处理器层"
|
||||
DEV["internal/handler/device.go<br/>设备上报日志"]
|
||||
@@ -59,52 +69,57 @@ CFG --> MAIN
|
||||
MAIN --> ZAP
|
||||
MAIN --> ROUTER
|
||||
ROUTER --> REQID
|
||||
ROUTER --> CACHE
|
||||
ROUTER --> LOGMW
|
||||
LOGMW --> DEV
|
||||
LOGMW --> MODEL
|
||||
LOGMW --> BRAND
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [cmd/server/main.go:22-95](file://cmd/server/main.go#L22-L95)
|
||||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
- [internal/router/router.go:22-81](file://internal/router/router.go#L22-L81)
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/handler/device.go:26-84](file://internal/handler/device.go#L26-L84)
|
||||
- [internal/handler/model.go:26-50](file://internal/handler/model.go#L26-L50)
|
||||
- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
- [internal/handler/device.go:27-93](file://internal/handler/device.go#L27-L93)
|
||||
- [internal/handler/model.go:25-60](file://internal/handler/model.go#L25-L60)
|
||||
- [internal/handler/brand.go:25-58](file://internal/handler/brand.go#L25-L58)
|
||||
|
||||
章节来源
|
||||
- [cmd/server/main.go:22-95](file://cmd/server/main.go#L22-L95)
|
||||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||||
**章节来源**
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
- [internal/router/router.go:22-81](file://internal/router/router.go#L22-L81)
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/handler/device.go:26-84](file://internal/handler/device.go#L26-L84)
|
||||
- [internal/handler/model.go:26-50](file://internal/handler/model.go#L26-L50)
|
||||
- [internal/handler/brand.go:26-49](file://internal/handler/brand.go#L26-L49)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
- [internal/handler/device.go:27-93](file://internal/handler/device.go#L27-L93)
|
||||
- [internal/handler/model.go:25-60](file://internal/handler/model.go#L25-L60)
|
||||
- [internal/handler/brand.go:25-58](file://internal/handler/brand.go#L25-L58)
|
||||
|
||||
## 核心组件
|
||||
- 日志器工厂(Zap 封装):根据环境变量选择生产或开发配置,定制时间键与编码器,返回全局日志器实例。
|
||||
- 请求日志中间件:在请求完成后收集状态码、方法、路径、延迟、IP、请求ID、查询串与错误信息,按状态码映射到不同日志级别。
|
||||
- 请求日志中间件:在请求完成后收集状态码、方法、路径、延迟、IP、请求ID、查询串与错误信息,按状态码映射到不同日志级别,**新增健康检查路由跳过功能**。
|
||||
- 请求ID中间件:生成唯一请求ID并在请求头中透传,便于跨服务/模块关联日志。
|
||||
- 启动入口:加载配置、设置 Gin 模式、创建日志器、连接数据库/缓存/搜索引擎、启动 HTTP 服务器并优雅关闭。
|
||||
- **缓存控制中间件**:**新增**为不同路由设置合适的 Cache-Control 头部,支持公共缓存、最大年龄、S-maxage 和 stale-while-revalidate 策略。
|
||||
- 启动入口:加载配置、设置 Gin 模式、创建日志器、连接数据库/缓存/搜索引擎、**启动缓存预热和定时任务**、启动 HTTP 服务器并优雅关闭。
|
||||
- 处理器层:在业务关键点记录 Info/Warn/Error 等日志,携带上下文字段,如远程IP、时间戳、错误详情等。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
- [cmd/server/main.go:22-95](file://cmd/server/main.go#L22-L95)
|
||||
- [internal/handler/device.go:47-78](file://internal/handler/device.go#L47-L78)
|
||||
- [internal/handler/model.go:33-43](file://internal/handler/model.go#L33-L43)
|
||||
- [internal/handler/brand.go:32-41](file://internal/handler/brand.go#L32-L41)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/handler/device.go:56-93](file://internal/handler/device.go#L56-L93)
|
||||
- [internal/handler/model.go:42-60](file://internal/handler/model.go#L42-L60)
|
||||
- [internal/handler/brand.go:39-58](file://internal/handler/brand.go#L39-L58)
|
||||
|
||||
## 架构总览
|
||||
下图展示了从启动到请求处理的完整日志链路,强调日志器的创建、中间件的注入与处理器中的使用。
|
||||
下图展示了从启动到请求处理的完整日志链路,强调日志器的创建、中间件的注入与处理器中的使用,**特别标注了缓存控制中间件的集成位置**。
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
@@ -112,13 +127,15 @@ participant Client as "客户端"
|
||||
participant Server as "HTTP服务器"
|
||||
participant Router as "Gin路由"
|
||||
participant ReqID as "请求ID中间件"
|
||||
participant Cache as "缓存控制中间件"
|
||||
participant LogMW as "请求日志中间件"
|
||||
participant Handler as "业务处理器"
|
||||
participant Logger as "Zap日志器"
|
||||
Client->>Server : "发起HTTP请求"
|
||||
Server->>Router : "进入路由"
|
||||
Router->>ReqID : "生成/透传请求ID"
|
||||
ReqID->>LogMW : "继续处理"
|
||||
ReqID->>Cache : "设置缓存控制头部"
|
||||
Cache->>LogMW : "继续处理"
|
||||
LogMW->>Handler : "调用业务处理器"
|
||||
Handler->>Logger : "记录Info/Warn/Error"
|
||||
Handler-->>Client : "返回响应"
|
||||
@@ -126,19 +143,20 @@ LogMW->>Logger : "记录请求日志(按状态码)"
|
||||
LogMW-->>Router : "完成"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [cmd/server/main.go:64-64](file://cmd/server/main.go#L64-L64)
|
||||
- [internal/router/router.go:17-18](file://internal/router/router.go#L17-L18)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:119-140](file://cmd/server/main.go#L119-L140)
|
||||
- [internal/router/router.go:25-27](file://internal/router/router.go#L25-L27)
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/handler/device.go:47-78](file://internal/handler/device.go#L47-L78)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [internal/handler/device.go:56-93](file://internal/handler/device.go#L56-L93)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
### 日志器工厂(Zap 封装)
|
||||
- 功能:根据环境变量选择生产或开发配置,定制时间键与编码器,构建并返回全局日志器。
|
||||
- 关键点:
|
||||
- 生产环境:使用生产配置,时间键为“time”,时间编码为 ISO8601。
|
||||
- 生产环境:使用生产配置,时间键为"**time**",时间编码为 ISO8601。
|
||||
- 开发环境:使用开发配置,级别编码为带颜色的大写形式。
|
||||
- 使用方式:在启动入口调用工厂创建日志器,并在退出前同步缓冲区。
|
||||
|
||||
@@ -152,17 +170,18 @@ DevCfg --> Build
|
||||
Build --> Return(["返回日志器"])
|
||||
```
|
||||
|
||||
图表来源
|
||||
**图表来源**
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
|
||||
### 请求日志中间件
|
||||
- 功能:在请求完成后记录关键指标,按状态码选择日志级别。
|
||||
- 功能:在请求完成后记录关键指标,按状态码选择日志级别,**新增健康检查路由跳过功能**。
|
||||
- 字段规范:
|
||||
- 状态码、方法、路径、延迟、客户端IP、请求ID。
|
||||
- 可选字段:查询串、错误信息。
|
||||
- **新增优化**:跳过 `/api/v1/health` 路径的日志记录,减少健康检查产生的日志噪音。
|
||||
- 级别映射:
|
||||
- 5xx:Error
|
||||
- 4xx:Warn
|
||||
@@ -170,7 +189,9 @@ Build --> Return(["返回日志器"])
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Enter(["进入中间件"]) --> Collect["收集开始时间/路径/查询串"]
|
||||
Enter(["进入中间件"]) --> HealthCheck{"是否为健康检查路由?"}
|
||||
HealthCheck --> |是| Skip["跳过日志记录"]
|
||||
HealthCheck --> |否| Collect["收集开始时间/路径/查询串"]
|
||||
Collect --> Next["调用后续处理器"]
|
||||
Next --> After["计算延迟/获取状态码/提取请求ID"]
|
||||
After --> HasErrors{"是否存在错误?"}
|
||||
@@ -180,26 +201,42 @@ AddErrors --> Level["按状态码选择级别"]
|
||||
SkipErrors --> Level
|
||||
Level --> Log["记录请求日志"]
|
||||
Log --> Exit(["返回响应"])
|
||||
Skip --> Exit
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
**图表来源**
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
|
||||
章节来源
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
**章节来源**
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
|
||||
### 请求ID中间件
|
||||
- 功能:生成随机十六进制字符串作为请求ID,若请求头未提供则自动生成并透传。
|
||||
- 作用:贯穿请求链路,便于聚合与关联日志。
|
||||
|
||||
章节来源
|
||||
**章节来源**
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
|
||||
### 缓存控制中间件
|
||||
- **新增功能**:为不同路由设置合适的 Cache-Control 头部,支持不同的缓存策略。
|
||||
- 支持的缓存策略:
|
||||
- 列表类路由:`public, max-age=300, s-maxage=1800, stale-while-revalidate=60`
|
||||
- 曲线类路由:`public, max-age=300, s-maxage=3600, stale-while-revalidate=120`
|
||||
- 模型列表路由:`public, max-age=30, s-maxage=300, stale-while-revalidate=30`
|
||||
- 作用:优化前端缓存策略,减少不必要的请求,提高响应速度。
|
||||
|
||||
**章节来源**
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
|
||||
### 启动入口与日志集成
|
||||
- 加载配置:从环境变量读取运行环境、主机、端口等。
|
||||
- 设置模式:生产环境设置 Gin 为 Release 模式。
|
||||
- 创建日志器:根据配置环境调用日志工厂。
|
||||
- 连接外部组件:数据库、搜索引擎、缓存;连接成功后记录 Info 日志。
|
||||
- **增强功能**:
|
||||
- 连接外部组件:数据库、搜索引擎、缓存;连接成功后记录 Info 日志。
|
||||
- **缓存预热**:启动时从数据库加载数据到 Redis,避免首次访问延迟。
|
||||
- **定时任务**:根据配置启动设备持久化任务和分享码持久化任务。
|
||||
- **S3 存储配置**:记录 S3 存储配置信息。
|
||||
- 启动服务器:记录启动日志,捕获异常并记录 Fatal 日志。
|
||||
- 优雅关闭:记录关闭与停止日志。
|
||||
|
||||
@@ -211,6 +248,7 @@ participant Log as "logger.New()"
|
||||
participant DB as "database.Open()"
|
||||
participant Redis as "cache.NewClient()"
|
||||
participant MS as "search.NewClient()"
|
||||
participant WarmUp as "warmUpCache()"
|
||||
participant Engine as "router.New()"
|
||||
Main->>Cfg : "加载配置"
|
||||
Cfg-->>Main : "返回配置"
|
||||
@@ -222,18 +260,20 @@ Main->>MS : "配置搜索引擎"
|
||||
MS-->>Main : "配置结果"
|
||||
Main->>Redis : "连接缓存"
|
||||
Redis-->>Main : "连接结果"
|
||||
Main->>WarmUp : "缓存预热"
|
||||
WarmUp-->>Main : "预热结果"
|
||||
Main->>Engine : "创建路由引擎"
|
||||
Engine-->>Main : "返回引擎"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [cmd/server/main.go:22-95](file://cmd/server/main.go#L22-L95)
|
||||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
|
||||
章节来源
|
||||
- [cmd/server/main.go:22-95](file://cmd/server/main.go#L22-L95)
|
||||
- [internal/config/config.go:18-56](file://internal/config/config.go#L18-L56)
|
||||
**章节来源**
|
||||
- [cmd/server/main.go:38-140](file://cmd/server/main.go#L38-L140)
|
||||
- [internal/config/config.go:24-71](file://internal/config/config.go#L24-L71)
|
||||
|
||||
### 处理器中的日志使用
|
||||
- 设备上报处理器:记录上报事件与远程IP、时间等字段;对序列化与缓存写入失败记录 Error 日志。
|
||||
@@ -267,16 +307,16 @@ ModelHandler --> ZapLogger : "记录Error"
|
||||
BrandHandler --> ZapLogger : "记录Error"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [internal/handler/device.go:14-24](file://internal/handler/device.go#L14-L24)
|
||||
- [internal/handler/model.go:14-24](file://internal/handler/model.go#L14-L24)
|
||||
- [internal/handler/brand.go:14-24](file://internal/handler/brand.go#L14-L24)
|
||||
**图表来源**
|
||||
- [internal/handler/device.go:15-25](file://internal/handler/device.go#L15-L25)
|
||||
- [internal/handler/model.go:13-23](file://internal/handler/model.go#L13-L23)
|
||||
- [internal/handler/brand.go:13-23](file://internal/handler/brand.go#L13-L23)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
|
||||
章节来源
|
||||
- [internal/handler/device.go:47-78](file://internal/handler/device.go#L47-L78)
|
||||
- [internal/handler/model.go:33-43](file://internal/handler/model.go#L33-L43)
|
||||
- [internal/handler/brand.go:32-41](file://internal/handler/brand.go#L32-L41)
|
||||
**章节来源**
|
||||
- [internal/handler/device.go:56-93](file://internal/handler/device.go#L56-L93)
|
||||
- [internal/handler/model.go:42-60](file://internal/handler/model.go#L42-L60)
|
||||
- [internal/handler/brand.go:39-58](file://internal/handler/brand.go#L39-L58)
|
||||
|
||||
## 依赖关系分析
|
||||
- 组件耦合:
|
||||
@@ -293,6 +333,7 @@ graph LR
|
||||
MAIN["cmd/server/main.go"] --> ROUTER["internal/router/router.go"]
|
||||
MAIN --> ZAP["pkg/logger/logger.go"]
|
||||
ROUTER --> REQID["internal/middleware/request_id.go"]
|
||||
ROUTER --> CACHE["internal/middleware/cache_control.go"]
|
||||
ROUTER --> LOGMW["internal/middleware/logger.go"]
|
||||
ROUTER --> DEV["internal/handler/device.go"]
|
||||
ROUTER --> MODEL["internal/handler/model.go"]
|
||||
@@ -302,81 +343,98 @@ MODEL --> ZAP
|
||||
BRAND --> ZAP
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [cmd/server/main.go:64-64](file://cmd/server/main.go#L64-L64)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
**图表来源**
|
||||
- [cmd/server/main.go:109](file://cmd/server/main.go#L109)
|
||||
- [internal/router/router.go:22-81](file://internal/router/router.go#L22-L81)
|
||||
- [internal/middleware/request_id.go:20-30](file://internal/middleware/request_id.go#L20-L30)
|
||||
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
||||
- [internal/handler/device.go:14-24](file://internal/handler/device.go#L14-L24)
|
||||
- [internal/handler/model.go:14-24](file://internal/handler/model.go#L14-L24)
|
||||
- [internal/handler/brand.go:14-24](file://internal/handler/brand.go#L14-L24)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
- [internal/middleware/logger.go:10-52](file://internal/middleware/logger.go#L10-L52)
|
||||
- [internal/handler/device.go:15-25](file://internal/handler/device.go#L15-L25)
|
||||
- [internal/handler/model.go:13-23](file://internal/handler/model.go#L13-L23)
|
||||
- [internal/handler/brand.go:13-23](file://internal/handler/brand.go#L13-L23)
|
||||
- [pkg/logger/logger.go:8-19](file://pkg/logger/logger.go#L8-L19)
|
||||
|
||||
章节来源
|
||||
- [go.mod:5-11](file://go.mod#L5-L11)
|
||||
- [internal/router/router.go:14-41](file://internal/router/router.go#L14-L41)
|
||||
**章节来源**
|
||||
- [go.mod:5-18](file://go.mod#L5-L18)
|
||||
- [internal/router/router.go:22-81](file://internal/router/router.go#L22-L81)
|
||||
|
||||
## 性能与轮转配置
|
||||
- 当前实现:
|
||||
- 日志器在启动时创建并使用默认输出(标准输出),未显式配置文件输出与轮转策略。
|
||||
- 在退出时执行同步,确保缓冲区落盘。
|
||||
- **新增优化**:
|
||||
- 健康检查路由跳过日志记录,减少系统监控产生的日志噪音。
|
||||
- 缓存预热在启动时完成,避免首次访问的性能抖动。
|
||||
- 不同路由使用不同的缓存策略,优化前端缓存效率。
|
||||
- 建议扩展(概念性指导):
|
||||
- 文件输出与轮转:通过自定义 Zap 编码器与输出目标,结合文件轮转策略(大小/时间/数量限制)提升可维护性。
|
||||
- 异步写入:启用异步日志器,减少阻塞;结合队列长度与丢弃策略平衡性能与可靠性。
|
||||
- 采样与速率限制:对高频日志进行采样,避免在峰值流量下产生过多 I/O。
|
||||
- 结构化字段规范化:统一字段命名与类型,便于下游检索与聚合。
|
||||
- 本节为通用建议,不直接对应具体代码文件。
|
||||
|
||||
## 最佳实践与规范
|
||||
- 字段命名规范
|
||||
- 使用语义明确的键名,如状态码、方法、路径、延迟、IP、请求ID、错误等。
|
||||
- 时间字段建议统一为 ISO8601 或 Unix 时间戳,便于排序与解析。
|
||||
- **新增**:缓存相关字段如 `cache_hit`、`cache_key` 等,便于缓存命中率统计。
|
||||
- 上下文传递
|
||||
- 通过请求ID贯穿请求链路,便于跨模块聚合日志。
|
||||
- 在处理器中记录关键业务事件与错误详情,包含上下文字段。
|
||||
- **新增**:缓存控制策略的上下文记录,便于性能分析。
|
||||
- 日志级别使用
|
||||
- Info:常规业务事件、连接成功、启动/关闭等。
|
||||
- Warn:客户端错误(4xx)、潜在问题但不影响功能。
|
||||
- Warn:客户端错误(4xx)、潜在问题但不影响功能、缓存预热失败等。
|
||||
- Error:服务端错误(5xx)、数据库/缓存/序列化失败等。
|
||||
- Fatal:致命错误导致进程退出,通常用于不可恢复的初始化失败。
|
||||
- **新增优化**:
|
||||
- 健康检查路由跳过日志记录,减少系统监控噪音。
|
||||
- 缓存预热阶段记录详细的预热进度和结果。
|
||||
- 不同路由使用不同的缓存策略,记录相应的缓存控制信息。
|
||||
- 性能考虑
|
||||
- 避免在热路径上进行昂贵的字符串拼接或格式化。
|
||||
- 对高频日志进行采样或降级。
|
||||
- 控制日志字段数量,仅记录必要信息。
|
||||
- **新增**:合理使用缓存控制中间件,减少不必要的请求。
|
||||
- 实践示例
|
||||
- 启动阶段记录连接信息与环境配置。
|
||||
- 中间件按状态码选择级别,统一记录请求指标。
|
||||
- 启动阶段记录连接信息与环境配置,包括缓存预热结果。
|
||||
- 中间件按状态码选择级别,统一记录请求指标,跳过健康检查。
|
||||
- 处理器在错误分支记录 Error 日志并返回统一错误响应。
|
||||
- **新增**:缓存控制中间件记录缓存策略的应用情况。
|
||||
|
||||
章节来源
|
||||
- [internal/middleware/logger.go:22-43](file://internal/middleware/logger.go#L22-L43)
|
||||
- [internal/handler/device.go:47-78](file://internal/handler/device.go#L47-L78)
|
||||
- [internal/handler/model.go:33-43](file://internal/handler/model.go#L33-L43)
|
||||
- [internal/handler/brand.go:32-41](file://internal/handler/brand.go#L32-L41)
|
||||
- [cmd/server/main.go:44-48](file://cmd/server/main.go#L44-L48)
|
||||
- [cmd/server/main.go:75-78](file://cmd/server/main.go#L75-L78)
|
||||
**章节来源**
|
||||
- [internal/middleware/logger.go:12-16](file://internal/middleware/logger.go#L12-L16)
|
||||
- [internal/middleware/cache_control.go:5-8](file://internal/middleware/cache_control.go#L5-L8)
|
||||
- [internal/handler/device.go:56-93](file://internal/handler/device.go#L56-L93)
|
||||
- [internal/handler/model.go:42-60](file://internal/handler/model.go#L42-L60)
|
||||
- [internal/handler/brand.go:39-58](file://internal/handler/brand.go#L39-L58)
|
||||
- [cmd/server/main.go:143-191](file://cmd/server/main.go#L143-L191)
|
||||
|
||||
## 故障排查与调试
|
||||
- 常见问题
|
||||
- 数据库连接失败:启动阶段记录 Fatal 日志,检查配置与网络连通性。
|
||||
- Redis 连接失败:记录 Error 日志,确认地址、端口与认证配置。
|
||||
- **新增**:缓存预热失败:检查数据库连接和缓存配置,查看预热日志。
|
||||
- **新增**:缓存控制中间件失效:检查路由注册顺序和缓存策略配置。
|
||||
- 请求日志缺失:确认中间件已注册且顺序正确。
|
||||
- 请求ID未透传:检查请求头是否被上游代理或网关修改。
|
||||
- 调试技巧
|
||||
- **新增调试技巧**:
|
||||
- 切换到开发环境以获得彩色输出与更详细的级别编码,便于本地调试。
|
||||
- 在关键业务点增加 Info 日志,记录输入参数与关键中间结果。
|
||||
- 使用统一错误响应包装,确保错误信息一致且可检索。
|
||||
- **新增**:利用缓存预热日志诊断缓存性能问题。
|
||||
- **新增**:检查缓存控制策略是否正确应用到相应路由。
|
||||
- 建议的排查步骤
|
||||
- 查看启动日志,确认各组件连接成功。
|
||||
- 在中间件层观察请求日志,定位异常状态码与耗时。
|
||||
- 查看启动日志,确认各组件连接成功和缓存预热结果。
|
||||
- 在中间件层观察请求日志,定位异常状态码与耗时,注意健康检查路由的特殊处理。
|
||||
- 在处理器层查看 Error 日志,结合请求ID定位具体请求。
|
||||
- 检查下游服务(数据库/缓存/搜索引擎)的可用性与配置。
|
||||
- **新增**:检查缓存控制中间件的缓存策略应用情况。
|
||||
|
||||
章节来源
|
||||
- [cmd/server/main.go:40-41](file://cmd/server/main.go#L40-L41)
|
||||
- [cmd/server/main.go:56-62](file://cmd/server/main.go#L56-L62)
|
||||
- [internal/middleware/logger.go:37-43](file://internal/middleware/logger.go#L37-L43)
|
||||
- [internal/handler/device.go:62-78](file://internal/handler/device.go#L62-L78)
|
||||
**章节来源**
|
||||
- [cmd/server/main.go:58-66](file://cmd/server/main.go#L58-L66)
|
||||
- [cmd/server/main.go:143-191](file://cmd/server/main.go#L143-L191)
|
||||
- [internal/middleware/logger.go:12-16](file://internal/middleware/logger.go#L12-L16)
|
||||
- [internal/middleware/cache_control.go:11-17](file://internal/middleware/cache_control.go#L11-L17)
|
||||
|
||||
## 结论
|
||||
本项目采用简洁而高效的日志体系:通过工厂封装统一创建日志器,中间件集中记录请求指标,处理器在关键节点记录业务与错误日志。结合请求ID与结构化字段,能够有效支撑日志聚合、监控告警与故障排查。建议在生产环境中进一步引入文件输出与轮转策略、异步写入与采样机制,以满足更高的可靠性与性能要求。
|
||||
本项目采用简洁而高效的日志体系:通过工厂封装统一创建日志器,中间件集中记录请求指标,处理器在关键节点记录业务与错误日志。**最新更新增强了系统的实用性**:新增缓存控制中间件的日志集成,优化健康检查路由的日志记录,扩展启动阶段的详细日志记录,包括缓存预热和定时任务。结合请求ID与结构化字段,能够有效支撑日志聚合、监控告警与故障排查。建议在生产环境中进一步引入文件输出与轮转策略、异步写入与采样机制,以满足更高的可靠性与性能要求。这些增强功能使得日志系统更加完善,能够更好地支持现代 Web 应用的监控和运维需求。
|
||||
Reference in New Issue
Block a user