665397ede7
- 新增OTA固件升级处理器,支持固件升级请求及黑名单过滤 - 引入设备持久化仓储,支持设备信息上报与活动记录 - 扩展数据模型,新增UserDevice与UserActive,支持设备版本跟踪 - 实现Redis到MySQL的异步数据同步任务 - 更新路由配置,集成新的API端点以支持OTA功能 - 优化架构图,反映新增的数据流与处理流程
651 lines
22 KiB
Markdown
651 lines
22 KiB
Markdown
# 设备管理接口
|
|
|
|
<cite>
|
|
**本文引用的文件**
|
|
- [internal/handler/device.go](file://internal/handler/device.go)
|
|
- [internal/router/router.go](file://internal/router/router.go)
|
|
- [internal/cache/redis.go](file://internal/cache/redis.go)
|
|
- [internal/config/redis.go](file://internal/config/redis.go)
|
|
- [internal/config/database.go](file://internal/config/database.go)
|
|
- [internal/database/mysql.go](file://internal/database/mysql.go)
|
|
- [internal/model/user_device.go](file://internal/model/user_device.go)
|
|
- [internal/model/user_active.go](file://internal/model/user_active.go)
|
|
- [internal/repository/device.go](file://internal/repository/device.go)
|
|
- [internal/task/device_persist.go](file://internal/task/device_persist.go)
|
|
- [internal/response/response.go](file://internal/response/response.go)
|
|
- [internal/middleware/logger.go](file://internal/middleware/logger.go)
|
|
- [internal/middleware/cors.go](file://internal/middleware/cors.go)
|
|
- [cmd/server/main.go](file://cmd/server/main.go)
|
|
- [sql/user_device.sql](file://sql/user_device.sql)
|
|
- [sql/user_active.sql](file://sql/user_active.sql)
|
|
- [README.md](file://README.md)
|
|
</cite>
|
|
|
|
## 更新摘要
|
|
**变更内容**
|
|
- 新增设备信息持久化系统,实现Redis到数据库的定时同步
|
|
- 添加DevicePersistTask组件,支持设备注册和活动跟踪的数据库持久化
|
|
- 新增数据库表user_device和user_active的完整数据结构
|
|
- 实现每5分钟的批量数据同步机制
|
|
- 增强数据一致性保证和错误处理机制
|
|
|
|
## 目录
|
|
1. [简介](#简介)
|
|
2. [项目结构](#项目结构)
|
|
3. [核心组件](#核心组件)
|
|
4. [架构概览](#架构概览)
|
|
5. [详细组件分析](#详细组件分析)
|
|
6. [数据库持久化系统](#数据库持久化系统)
|
|
7. [依赖关系分析](#依赖关系分析)
|
|
8. [性能考虑](#性能考虑)
|
|
9. [故障排除指南](#故障排除指南)
|
|
10. [结论](#结论)
|
|
|
|
## 简介
|
|
|
|
本文档详细描述了设备管理接口的完整规范,特别是设备信息上报接口。该接口允许设备向服务器上报其基本信息,包括 MAC 地址、型号、版本号等,并将数据存储在 Redis 缓存中。系统现已集成设备信息持久化系统,通过DevicePersistTask组件实现Redis到数据库的定时同步,支持设备注册和活动跟踪的数据库持久化。
|
|
|
|
文档涵盖了 HTTP 方法、URL 模式、请求参数结构、响应格式、错误处理、数据验证规则、重复上报处理和数据一致性保证等方面。
|
|
|
|
## 项目结构
|
|
|
|
该项目采用分层架构设计,主要分为以下层次:
|
|
- **入口层**: `cmd/server/main.go` - 应用程序入口点,负责初始化配置、数据库连接、搜索引擎和缓存客户端
|
|
- **路由层**: `internal/router/router.go` - 路由定义和中间件配置
|
|
- **处理器层**: `internal/handler/device.go` - 设备信息上报业务逻辑
|
|
- **任务层**: `internal/task/device_persist.go` - 设备信息持久化任务
|
|
- **缓存层**: `internal/cache/redis.go` 和 `internal/config/redis.go` - Redis 客户端配置和连接管理
|
|
- **数据库层**: `internal/config/database.go`、`internal/database/mysql.go` - 数据库配置和连接管理
|
|
- **模型层**: `internal/model/user_device.go`、`internal/model/user_active.go` - 数据库模型定义
|
|
- **仓库层**: `internal/repository/device.go` - 数据访问层
|
|
- **响应层**: `internal/response/response.go` - 统一响应格式
|
|
- **中间件层**: `internal/middleware/logger.go` 和 `internal/middleware/cors.go` - 日志记录和跨域支持
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "应用入口"
|
|
Main[cmd/server/main.go]
|
|
end
|
|
subgraph "HTTP框架"
|
|
Gin[Gin Web框架]
|
|
Router[路由层]
|
|
Middleware[中间件层]
|
|
end
|
|
subgraph "业务处理"
|
|
DeviceHandler[设备处理器]
|
|
DevicePersistTask[设备持久化任务]
|
|
Response[响应层]
|
|
end
|
|
subgraph "数据存储"
|
|
Redis[Redis缓存]
|
|
MySQL[MySQL数据库]
|
|
Config[配置管理]
|
|
end
|
|
subgraph "数据模型"
|
|
UserDevice[用户设备模型]
|
|
UserActive[用户活跃模型]
|
|
Repository[数据访问层]
|
|
end
|
|
Main --> Gin
|
|
Gin --> Router
|
|
Router --> Middleware
|
|
Router --> DeviceHandler
|
|
DeviceHandler --> Response
|
|
DeviceHandler --> Redis
|
|
DevicePersistTask --> MySQL
|
|
DevicePersistTask --> Redis
|
|
DevicePersistTask --> Repository
|
|
Repository --> UserDevice
|
|
Repository --> UserActive
|
|
Main --> Config
|
|
Main --> Redis
|
|
Main --> MySQL
|
|
```
|
|
|
|
**图表来源**
|
|
- [cmd/server/main.go:27-76](file://cmd/server/main.go#L27-L76)
|
|
- [internal/handler/device.go:15-25](file://internal/handler/device.go#L15-L25)
|
|
- [internal/task/device_persist.go:14-22](file://internal/task/device_persist.go#L14-L22)
|
|
|
|
**章节来源**
|
|
- [cmd/server/main.go:1-156](file://cmd/server/main.go#L1-L156)
|
|
- [internal/router/router.go:1-42](file://internal/router/router.go#L1-L42)
|
|
|
|
## 核心组件
|
|
|
|
### 设备信息上报接口
|
|
|
|
设备信息上报接口是本项目的核心功能,负责接收设备上报的信息并进行处理。该接口实现了以下关键功能:
|
|
|
|
- **参数验证**: 对必需参数进行验证,确保数据完整性
|
|
- **数据格式化**: 将设备信息转换为统一的 JSON 格式
|
|
- **缓存存储**: 使用 Redis Hash 结构存储设备信息
|
|
- **错误处理**: 提供统一的错误响应格式
|
|
|
|
### 设备持久化任务
|
|
|
|
新增的设备持久化任务组件负责将Redis中的设备信息定期同步到数据库中,实现数据的长期持久化存储。该组件具有以下特点:
|
|
|
|
- **定时同步**: 每5分钟自动执行一次数据同步
|
|
- **批量处理**: 支持批量读取和处理Redis中的设备数据
|
|
- **事务保证**: 确保数据库操作的一致性
|
|
- **错误恢复**: 具备完善的错误处理和日志记录机制
|
|
|
|
### 接口规范
|
|
|
|
#### HTTP 请求规范
|
|
|
|
- **方法**: GET
|
|
- **路径**: `/audio/reportDevInfo`
|
|
- **协议**: HTTP/1.1
|
|
- **内容类型**: application/x-www-form-urlencoded
|
|
|
|
#### 请求参数
|
|
|
|
| 参数名 | 类型 | 必填 | 描述 | 示例 |
|
|
|--------|------|------|------|------|
|
|
| mac | string | 是 | 设备 MAC 地址 | `00:1A:2B:3C:4D:5E` |
|
|
| model | string | 是 | 设备型号 | `ES900` |
|
|
| ver | string | 否 | 设备版本号 | `v2.1.0` |
|
|
|
|
#### 请求头
|
|
|
|
| 头部名称 | 描述 | 示例 |
|
|
|----------|------|------|
|
|
| X-Forwarded-For | 客户端真实 IP 地址 | `192.168.1.100` |
|
|
|
|
#### 响应格式
|
|
|
|
接口返回统一的 JSON 格式响应:
|
|
|
|
```json
|
|
{
|
|
"code": 200,
|
|
"msg": "操作成功"
|
|
}
|
|
```
|
|
|
|
#### 错误响应
|
|
|
|
当请求参数无效或系统发生错误时,接口返回相应的错误码:
|
|
|
|
| 状态码 | 错误码 | 描述 | 响应示例 |
|
|
|--------|--------|------|----------|
|
|
| 200 | 400 | 参数校验失败 | `{"code": 400, "msg": "参数校验失败"}` |
|
|
| 200 | 500 | 系统错误 | `{"code": 500, "msg": "系统错误"}` |
|
|
|
|
**章节来源**
|
|
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
|
|
- [internal/router/router.go:32-38](file://internal/router/router.go#L32-L38)
|
|
|
|
## 架构概览
|
|
|
|
设备管理接口在整个系统架构中的位置如下:
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Client as 设备客户端
|
|
participant API as API网关
|
|
participant Handler as 设备处理器
|
|
participant Redis as Redis缓存
|
|
participant Task as 持久化任务
|
|
participant DB as MySQL数据库
|
|
participant Logger as 日志系统
|
|
Client->>API : GET /audio/reportDevInfo?mac=&model=&ver=
|
|
API->>Handler : 调用 ReportDevInfo()
|
|
Handler->>Handler : 参数验证
|
|
alt 参数验证失败
|
|
Handler->>Client : 返回错误响应
|
|
else 参数验证成功
|
|
Handler->>Handler : 格式化设备信息
|
|
Handler->>Redis : HSET devices {mac} : {json_data}
|
|
alt Redis操作失败
|
|
Handler->>Logger : 记录错误日志
|
|
Handler->>Client : 返回系统错误
|
|
else Redis操作成功
|
|
Handler->>Client : 返回成功响应
|
|
end
|
|
end
|
|
Note over Task,DB : 每5分钟定时执行
|
|
Task->>Redis : HGetAll devices
|
|
Task->>Task : 解析JSON数据
|
|
Task->>DB : 插入/更新 user_device
|
|
Task->>DB : 插入/更新 user_active
|
|
Task->>Redis : HDel 成功记录
|
|
Task->>Logger : 记录同步结果
|
|
```
|
|
|
|
**图表来源**
|
|
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
|
|
- [internal/task/device_persist.go:37-91](file://internal/task/device_persist.go#L37-L91)
|
|
|
|
## 详细组件分析
|
|
|
|
### 设备处理器类图
|
|
|
|
```mermaid
|
|
classDiagram
|
|
class DeviceHandler {
|
|
-redis : redis.Client
|
|
-log : zap.Logger
|
|
+NewDeviceHandler(redis, log) DeviceHandler
|
|
+ReportDevInfo(c) void
|
|
}
|
|
class DevicePersistTask {
|
|
-rdb : redis.Client
|
|
-repo : DeviceRepository
|
|
-log : zap.Logger
|
|
+NewDevicePersistTask(rdb, repo, log) DevicePersistTask
|
|
+Start(interval) void
|
|
+Persist() void
|
|
+persistDevice(ctx, info) bool
|
|
+persistActive(ctx, info) bool
|
|
}
|
|
class RedisClient {
|
|
+HSet(ctx, key, field, value) error
|
|
+HGetAll(ctx, key) map[string]string
|
|
+HDel(ctx, key, fields) error
|
|
+Close() error
|
|
}
|
|
class Logger {
|
|
+Info(message, fields) void
|
|
+Error(message, error) void
|
|
}
|
|
DeviceHandler --> RedisClient : 使用
|
|
DeviceHandler --> Logger : 记录日志
|
|
DevicePersistTask --> RedisClient : 读取数据
|
|
DevicePersistTask --> Logger : 记录日志
|
|
```
|
|
|
|
**图表来源**
|
|
- [internal/handler/device.go:15-25](file://internal/handler/device.go#L15-L25)
|
|
- [internal/task/device_persist.go:14-22](file://internal/task/device_persist.go#L14-L22)
|
|
|
|
### 参数验证流程
|
|
|
|
设备信息上报接口的参数验证流程如下:
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start([开始处理请求]) --> GetParams["获取查询参数<br/>mac, model, ver"]
|
|
GetParams --> TrimParams["去除空白字符"]
|
|
TrimParams --> ValidateMac{"mac是否为空?"}
|
|
ValidateMac --> |是| ReturnError["返回参数校验失败"]
|
|
ValidateMac --> |否| ValidateModel{"model是否为空?"}
|
|
ValidateModel --> |是| ReturnError
|
|
ValidateModel --> |否| CheckVer{"ver是否为空?"}
|
|
CheckVer --> |是| SetEmptyVer["设置ver为空字符串"]
|
|
CheckVer --> |否| GetIP["获取X-Forwarded-For头部"]
|
|
SetEmptyVer --> GetIP
|
|
GetIP --> LogInfo["记录日志信息"]
|
|
LogInfo --> FormatData["格式化设备信息"]
|
|
FormatData --> MarshalJSON["序列化为JSON"]
|
|
MarshalJSON --> JSONSuccess{"JSON序列化成功?"}
|
|
JSONSuccess --> |否| ReturnSystemError["返回系统错误"]
|
|
JSONSuccess --> |是| SaveToRedis["保存到Redis"]
|
|
SaveToRedis --> RedisSuccess{"Redis操作成功?"}
|
|
RedisSuccess --> |否| ReturnSystemError
|
|
RedisSuccess --> |是| ReturnSuccess["返回成功响应"]
|
|
ReturnError --> End([结束])
|
|
ReturnSystemError --> End
|
|
ReturnSuccess --> End
|
|
```
|
|
|
|
**图表来源**
|
|
- [internal/handler/device.go:27-83](file://internal/handler/device.go#L27-L83)
|
|
|
|
### Redis 缓存交互
|
|
|
|
设备信息上报接口使用 Redis Hash 结构存储设备数据:
|
|
|
|
- **键名**: `devices`
|
|
- **字段**: 设备 MAC 地址
|
|
- **值**: JSON 格式的设备信息对象
|
|
|
|
存储的数据结构示例:
|
|
```json
|
|
{
|
|
"mac_addr": "00:1A:2B:3C:4D:5E",
|
|
"model": "ES900",
|
|
"active_date": "2024-01-15",
|
|
"ip_addr": "192.168.1.100",
|
|
"ver": "v2.1.0"
|
|
}
|
|
```
|
|
|
|
**章节来源**
|
|
- [internal/handler/device.go:50-77](file://internal/handler/device.go#L50-L77)
|
|
|
|
### 中间件集成
|
|
|
|
系统集成了多个中间件来增强功能:
|
|
|
|
#### 日志中间件
|
|
- 记录每个请求的状态、方法、路径、延迟时间
|
|
- 区分不同级别的日志输出
|
|
- 包含请求 ID 和错误信息
|
|
|
|
#### CORS 中间件
|
|
- 支持跨域请求
|
|
- 允许的方法:GET, POST, PUT, PATCH, DELETE, OPTIONS
|
|
- 允许的头部:Origin, Content-Type, Accept, Authorization, X-Request-ID
|
|
|
|
**章节来源**
|
|
- [internal/middleware/logger.go:10-45](file://internal/middleware/logger.go#L10-L45)
|
|
- [internal/middleware/cors.go:7-20](file://internal/middleware/cors.go#L7-L20)
|
|
|
|
## 数据库持久化系统
|
|
|
|
### 设备持久化任务架构
|
|
|
|
新增的设备持久化任务系统实现了Redis到数据库的定时同步,确保设备信息的长期持久化存储。
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start([启动持久化任务]) --> Timer["5分钟定时器"]
|
|
Timer --> GetData["从Redis读取所有设备数据"]
|
|
GetData --> ParseData["解析JSON数据"]
|
|
ParseData --> FixDate["修复日期格式"]
|
|
FixDate --> ProcessDevice["处理设备信息"]
|
|
ProcessDevice --> ProcessActive["处理活跃信息"]
|
|
ProcessActive --> Success{"处理成功?"}
|
|
Success --> |是| BatchDelete["批量删除已处理记录"]
|
|
Success --> |否| LogError["记录错误日志"]
|
|
BatchDelete --> Complete["完成同步"]
|
|
LogError --> Complete
|
|
Complete --> Timer
|
|
```
|
|
|
|
**图表来源**
|
|
- [internal/task/device_persist.go:24-35](file://internal/task/device_persist.go#L24-L35)
|
|
- [internal/task/device_persist.go:37-91](file://internal/task/device_persist.go#L37-L91)
|
|
|
|
### 数据库表结构
|
|
|
|
#### 用户设备表 (user_device)
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|--------|------|------|------|
|
|
| id | int | PRIMARY KEY, AUTO_INCREMENT | 主键ID |
|
|
| mac_addr | varchar(255) | UNIQUE, NOT NULL | 设备MAC地址 |
|
|
| model | varchar(255) | NOT NULL | 设备型号 |
|
|
| add_time | datetime | DEFAULT CURRENT_TIMESTAMP | 添加时间 |
|
|
| ver | varchar(10) | NULL | 设备版本号 |
|
|
|
|
#### 用户活跃表 (user_active)
|
|
|
|
| 字段名 | 类型 | 约束 | 描述 |
|
|
|--------|------|------|------|
|
|
| id | int | PRIMARY KEY, AUTO_INCREMENT | 主键ID |
|
|
| mac_addr | varchar(100) | NOT NULL | 设备MAC地址 |
|
|
| model | varchar(50) | NOT NULL | 设备型号 |
|
|
| active_date | date | NOT NULL | 活跃日期 |
|
|
| ip_addr | varchar(100) | NOT NULL | IP地址 |
|
|
| create_at | datetime | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
|
|
|
|
**章节来源**
|
|
- [sql/user_device.sql:24-32](file://sql/user_device.sql#L24-L32)
|
|
- [sql/user_active.sql:24-33](file://sql/user_active.sql#L24-L33)
|
|
|
|
### 数据同步流程
|
|
|
|
设备持久化任务的数据同步流程如下:
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant Redis as Redis缓存
|
|
participant Task as 持久化任务
|
|
participant Repo as 数据访问层
|
|
participant DB as MySQL数据库
|
|
Task->>Redis : HGetAll devices
|
|
Redis->>Task : 返回设备数据
|
|
Task->>Task : 解析JSON数据
|
|
Task->>Task : 修复日期格式
|
|
Task->>Repo : 查找设备信息
|
|
Repo->>DB : 查询user_device
|
|
DB->>Repo : 返回查询结果
|
|
alt 设备不存在
|
|
Task->>Repo : 插入新设备
|
|
Repo->>DB : INSERT user_device
|
|
DB->>Repo : 返回插入结果
|
|
else 设备存在
|
|
Task->>Repo : 更新设备版本
|
|
Repo->>DB : UPDATE user_device
|
|
DB->>Repo : 返回更新结果
|
|
end
|
|
Task->>Repo : 查找活跃信息
|
|
Repo->>DB : 查询user_active
|
|
DB->>Repo : 返回查询结果
|
|
alt 活跃信息不存在
|
|
Task->>Repo : 插入新活跃记录
|
|
Repo->>DB : INSERT user_active
|
|
DB->>Repo : 返回插入结果
|
|
else 活跃信息存在
|
|
Task->>Repo : 更新IP地址
|
|
Repo->>DB : UPDATE user_active
|
|
DB->>Repo : 返回更新结果
|
|
end
|
|
Task->>Redis : HDel 成功记录
|
|
```
|
|
|
|
**图表来源**
|
|
- [internal/task/device_persist.go:93-131](file://internal/task/device_persist.go#L93-L131)
|
|
- [internal/task/device_persist.go:133-166](file://internal/task/device_persist.go#L133-L166)
|
|
|
|
### 数据一致性保证
|
|
|
|
系统通过以下机制确保数据一致性:
|
|
|
|
1. **原子性**: 使用数据库事务确保设备和活跃信息的更新原子性
|
|
2. **幂等性**: 支持重复上报的处理,避免数据重复
|
|
3. **回滚机制**: 当部分操作失败时,系统会记录错误并继续处理其他记录
|
|
4. **数据修复**: 自动修复历史数据中的无效日期格式
|
|
|
|
**章节来源**
|
|
- [internal/task/device_persist.go:70-73](file://internal/task/device_persist.go#L70-L73)
|
|
- [internal/task/device_persist.go:101-128](file://internal/task/device_persist.go#L101-L128)
|
|
- [internal/task/device_persist.go:141-163](file://internal/task/device_persist.go#L141-L163)
|
|
|
|
## 依赖关系分析
|
|
|
|
### 外部依赖
|
|
|
|
项目的主要外部依赖包括:
|
|
|
|
```mermaid
|
|
graph LR
|
|
subgraph "Go标准库"
|
|
StdLib[标准库]
|
|
end
|
|
subgraph "第三方库"
|
|
Gin[Gin Web框架]
|
|
Redis[Redis客户端]
|
|
MySQL[MySQL驱动]
|
|
Zap[Zap日志库]
|
|
Time[时间处理]
|
|
Context[上下文]
|
|
End
|
|
subgraph "内部模块"
|
|
Handler[处理器层]
|
|
Task[任务层]
|
|
Cache[缓存层]
|
|
Database[数据库层]
|
|
Model[模型层]
|
|
Repository[仓库层]
|
|
Response[响应层]
|
|
Middleware[中间件层]
|
|
end
|
|
Handler --> Gin
|
|
Handler --> Redis
|
|
Handler --> Context
|
|
Task --> Redis
|
|
Task --> MySQL
|
|
Task --> Time
|
|
Task --> Model
|
|
Task --> Repository
|
|
Cache --> Redis
|
|
Database --> MySQL
|
|
Repository --> Database
|
|
Response --> Gin
|
|
Middleware --> Gin
|
|
Middleware --> Zap
|
|
```
|
|
|
|
**图表来源**
|
|
- [internal/handler/device.go:3-13](file://internal/handler/device.go#L3-L13)
|
|
- [internal/task/device_persist.go:3-12](file://internal/task/device_persist.go#L3-L12)
|
|
|
|
### 内部模块依赖
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "入口模块"
|
|
Main[cmd/server/main.go]
|
|
end
|
|
subgraph "配置模块"
|
|
Config[internal/config/config.go]
|
|
RedisConfig[internal/config/redis.go]
|
|
DBConfig[internal/config/database.go]
|
|
end
|
|
subgraph "服务模块"
|
|
Router[internal/router/router.go]
|
|
Handler[internal/handler/device.go]
|
|
Task[internal/task/device_persist.go]
|
|
Cache[internal/cache/redis.go]
|
|
Database[internal/database/mysql.go]
|
|
end
|
|
subgraph "数据模块"
|
|
Model[internal/model/user_device.go]
|
|
Model2[internal/model/user_active.go]
|
|
Repository[internal/repository/device.go]
|
|
SQL[sql/user_device.sql]
|
|
SQL2[sql/user_active.sql]
|
|
end
|
|
subgraph "工具模块"
|
|
Response[internal/response/response.go]
|
|
Logger[internal/middleware/logger.go]
|
|
CORS[internal/middleware/cors.go]
|
|
end
|
|
Main --> Config
|
|
Main --> Router
|
|
Main --> Cache
|
|
Main --> Database
|
|
Router --> Handler
|
|
Router --> Task
|
|
Handler --> Response
|
|
Handler --> Cache
|
|
Task --> Repository
|
|
Task --> Model
|
|
Task --> Model2
|
|
Repository --> Database
|
|
Repository --> Model
|
|
Repository --> Model2
|
|
Router --> Logger
|
|
Router --> CORS
|
|
Cache --> RedisConfig
|
|
Database --> DBConfig
|
|
```
|
|
|
|
**图表来源**
|
|
- [cmd/server/main.go:27-76](file://cmd/server/main.go#L27-L76)
|
|
- [internal/router/router.go:6-12](file://internal/router/router.go#L6-L12)
|
|
|
|
**章节来源**
|
|
- [cmd/server/main.go:1-156](file://cmd/server/main.go#L1-L156)
|
|
- [internal/config/config.go:1-64](file://internal/config/config.go#L1-L64)
|
|
|
|
## 性能考虑
|
|
|
|
### Redis 性能优化
|
|
|
|
1. **连接池管理**: 使用单个 Redis 客户端实例,避免频繁创建连接
|
|
2. **内存使用**: 设备信息以 JSON 字符串形式存储,占用内存较小
|
|
3. **键设计**: 使用简单的哈希结构,查询效率高
|
|
4. **批量操作**: 持久化任务使用批量删除操作,提高Redis清理效率
|
|
|
|
### 数据库性能优化
|
|
|
|
1. **连接池配置**: MySQL连接池最大25个连接,空闲5个连接,连接生命周期5分钟
|
|
2. **分区策略**: user_active表按日期分区,提高查询性能
|
|
3. **索引优化**: 设备表使用唯一索引,活跃表使用复合索引
|
|
4. **批量写入**: 持久化任务支持批量数据写入
|
|
|
|
### 请求处理优化
|
|
|
|
1. **参数预处理**: 使用 `strings.TrimSpace()` 去除多余空白字符
|
|
2. **早期返回**: 在参数验证失败时立即返回错误
|
|
3. **上下文传递**: 使用请求上下文进行异步操作
|
|
4. **定时任务**: 使用ticker实现精确的5分钟定时执行
|
|
|
|
### 监控建议
|
|
|
|
1. **Redis 监控**: 监控键数量、内存使用率、命令执行时间
|
|
2. **数据库监控**: 监控连接数、查询性能、分区使用情况
|
|
3. **应用监控**: 监控请求延迟、错误率、并发请求数
|
|
4. **持久化监控**: 监控数据同步成功率、处理速度
|
|
|
|
## 故障排除指南
|
|
|
|
### 常见问题及解决方案
|
|
|
|
#### 参数验证失败
|
|
**症状**: 返回 `{"code": 400, "msg": "参数校验失败"}`
|
|
**原因**: 缺少必需参数 `mac` 或 `model`
|
|
**解决方法**: 确保在请求中包含完整的参数
|
|
|
|
#### Redis 连接错误
|
|
**症状**: 返回 `{"code": 500, "msg": "系统错误"}`
|
|
**原因**: Redis 服务器不可达或认证失败
|
|
**解决方法**: 检查 Redis 配置和网络连接
|
|
|
|
#### JSON 序列化错误
|
|
**症状**: 返回 `{"code": 500, "msg": "系统错误"}`
|
|
**原因**: 设备信息格式化过程中出现异常
|
|
**解决方法**: 检查设备信息的数据类型和格式
|
|
|
|
#### 数据库连接错误
|
|
**症状**: 持久化任务日志显示数据库连接失败
|
|
**原因**: 数据库服务器不可达或配置错误
|
|
**解决方法**: 检查数据库配置和网络连接
|
|
|
|
#### 数据同步失败
|
|
**症状**: 持久化任务日志显示某些设备同步失败
|
|
**原因**: 数据库约束冲突或数据格式问题
|
|
**解决方法**: 检查设备数据的完整性和格式
|
|
|
|
### 调试步骤
|
|
|
|
1. **启用详细日志**: 检查日志中间件输出的请求信息
|
|
2. **验证参数**: 确认请求参数的完整性和正确性
|
|
3. **测试 Redis**: 验证 Redis 服务的可用性和权限设置
|
|
4. **查看响应**: 分析接口返回的具体错误信息
|
|
5. **检查数据库**: 验证数据库连接和表结构
|
|
6. **监控持久化**: 查看持久化任务的执行状态和日志
|
|
|
|
**章节来源**
|
|
- [internal/handler/device.go:33-39](file://internal/handler/device.go#L33-L39)
|
|
- [internal/handler/device.go:69-76](file://internal/handler/device.go#L69-L76)
|
|
- [internal/task/device_persist.go:43-46](file://internal/task/device_persist.go#L43-L46)
|
|
|
|
## 结论
|
|
|
|
设备管理接口提供了简单而高效的设备信息上报功能,并通过新增的设备持久化系统实现了数据的长期可靠存储。该系统结合了Redis的高性能缓存和MySQL的持久化存储,形成了完整的设备管理解决方案。
|
|
|
|
### 主要优势
|
|
|
|
1. **简洁明了**: 接口设计简单,易于理解和使用
|
|
2. **可靠性强**: 完善的错误处理和日志记录机制
|
|
3. **性能优秀**: 使用 Redis 缓存,响应速度快;支持定时批量同步
|
|
4. **扩展性强**: 基于 Gin 框架,便于功能扩展
|
|
5. **数据持久化**: 通过定时任务确保数据的长期存储
|
|
6. **数据一致性**: 通过事务和幂等性设计保证数据一致性
|
|
|
|
### 改进建议
|
|
|
|
1. **数据验证增强**: 可以添加更严格的数据格式验证
|
|
2. **限流机制**: 可以添加请求频率限制,防止恶意刷取
|
|
3. **API 版本控制**: 可以添加 API 版本号,便于后续升级
|
|
4. **监控告警**: 可以添加更完善的监控和告警机制
|
|
5. **数据备份**: 可以添加数据库备份和恢复机制
|
|
|
|
该接口为设备管理系统提供了坚实的基础,新增的持久化系统进一步增强了系统的可靠性和数据安全性,可以根据具体需求进一步扩展和完善。 |