1555 lines
30 KiB
Markdown
1555 lines
30 KiB
Markdown
|
|
# 宁夏智慧养殖监管平台系统架构文档
|
|||
|
|
|
|||
|
|
## 版本历史
|
|||
|
|
|
|||
|
|
| 版本 | 日期 | 作者 | 描述 |
|
|||
|
|
|------|------|------|------|
|
|||
|
|
| v1.0 | 2025-01-18 | 架构师 | 初始版本 |
|
|||
|
|
| v2.0 | 2025-01-19 | 架构师 | 全面重构,增加多端支持和微服务架构 |
|
|||
|
|
|
|||
|
|
## 1. 架构概述
|
|||
|
|
|
|||
|
|
### 1.1 系统定位
|
|||
|
|
|
|||
|
|
宁夏智慧养殖监管平台是一个面向现代化养殖业的综合性数字化监管平台,采用分布式架构设计,支持多端应用,提供全方位的养殖监管、数据分析和业务服务功能。
|
|||
|
|
|
|||
|
|
### 1.2 设计原则
|
|||
|
|
|
|||
|
|
**可扩展性原则:**
|
|||
|
|
- 采用模块化设计,支持功能模块独立扩展
|
|||
|
|
- 支持水平扩展,可根据业务需求增加服务器节点
|
|||
|
|
- 预留接口,支持第三方系统集成
|
|||
|
|
|
|||
|
|
**高可用性原则:**
|
|||
|
|
- 采用负载均衡和故障转移机制
|
|||
|
|
- 数据库主从架构,确保数据安全
|
|||
|
|
- 服务降级和熔断机制,保证系统稳定性
|
|||
|
|
|
|||
|
|
**安全性原则:**
|
|||
|
|
- 多层安全防护,包括网络、应用、数据层面
|
|||
|
|
- 身份认证和权限控制机制
|
|||
|
|
- 数据加密传输和存储
|
|||
|
|
|
|||
|
|
**性能优化原则:**
|
|||
|
|
- 缓存机制提升响应速度
|
|||
|
|
- 数据库优化和索引设计
|
|||
|
|
- CDN加速静态资源访问
|
|||
|
|
|
|||
|
|
### 1.3 技术选型理由
|
|||
|
|
|
|||
|
|
**后端技术栈选择:**
|
|||
|
|
- **Node.js**: 高并发处理能力,适合IoT数据处理
|
|||
|
|
- **Express.js**: 轻量级Web框架,开发效率高
|
|||
|
|
- **Sequelize**: 成熟的ORM框架,支持多种数据库
|
|||
|
|
- **MySQL**: 稳定可靠的关系型数据库,适合业务数据存储
|
|||
|
|
- **Redis**: 高性能缓存,提升系统响应速度
|
|||
|
|
|
|||
|
|
**前端技术栈选择:**
|
|||
|
|
- **Vue 3**: 现代化前端框架,组件化开发
|
|||
|
|
- **Vite**: 快速构建工具,开发体验好
|
|||
|
|
- **Ant Design Vue**: 企业级UI组件库,界面美观
|
|||
|
|
- **ECharts**: 强大的数据可视化库
|
|||
|
|
- **Pinia**: 轻量级状态管理
|
|||
|
|
|
|||
|
|
## 2. 系统架构设计
|
|||
|
|
|
|||
|
|
### 2.1 整体架构图
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "用户层"
|
|||
|
|
A[Web管理后台]
|
|||
|
|
B[数据可视化大屏]
|
|||
|
|
C[银行端小程序]
|
|||
|
|
D[政府端小程序]
|
|||
|
|
E[保险端小程序]
|
|||
|
|
F[官方网站]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "网关层"
|
|||
|
|
G[Nginx负载均衡器]
|
|||
|
|
H[API网关]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "应用层"
|
|||
|
|
I[认证服务]
|
|||
|
|
J[养殖场管理服务]
|
|||
|
|
K[设备监控服务]
|
|||
|
|
L[数据分析服务]
|
|||
|
|
M[消息通知服务]
|
|||
|
|
N[文件管理服务]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "数据层"
|
|||
|
|
O[MySQL主库]
|
|||
|
|
P[MySQL从库]
|
|||
|
|
Q[Redis缓存]
|
|||
|
|
R[文件存储OSS]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "外部服务"
|
|||
|
|
S[百度地图API]
|
|||
|
|
T[短信服务]
|
|||
|
|
U[邮件服务]
|
|||
|
|
V[微信服务]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
A --> G
|
|||
|
|
B --> G
|
|||
|
|
C --> G
|
|||
|
|
D --> G
|
|||
|
|
E --> G
|
|||
|
|
F --> G
|
|||
|
|
|
|||
|
|
G --> H
|
|||
|
|
H --> I
|
|||
|
|
H --> J
|
|||
|
|
H --> K
|
|||
|
|
H --> L
|
|||
|
|
H --> M
|
|||
|
|
H --> N
|
|||
|
|
|
|||
|
|
I --> O
|
|||
|
|
J --> O
|
|||
|
|
K --> O
|
|||
|
|
L --> O
|
|||
|
|
M --> Q
|
|||
|
|
N --> R
|
|||
|
|
|
|||
|
|
O --> P
|
|||
|
|
|
|||
|
|
M --> S
|
|||
|
|
M --> T
|
|||
|
|
M --> U
|
|||
|
|
M --> V
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2.2 分层架构设计
|
|||
|
|
|
|||
|
|
#### 2.2.1 表现层 (Presentation Layer)
|
|||
|
|
|
|||
|
|
**Web管理后台:**
|
|||
|
|
- 基于Vue 3 + Ant Design Vue构建
|
|||
|
|
- 响应式设计,支持多种屏幕尺寸
|
|||
|
|
- 模块化组件设计,便于维护和扩展
|
|||
|
|
- 支持权限控制和角色管理
|
|||
|
|
|
|||
|
|
**数据可视化大屏:**
|
|||
|
|
- 全屏展示模式,适配大屏显示设备
|
|||
|
|
- 实时数据更新,支持WebSocket连接
|
|||
|
|
- 丰富的图表展示,基于ECharts实现
|
|||
|
|
- 自适应布局,支持不同分辨率
|
|||
|
|
|
|||
|
|
**小程序矩阵:**
|
|||
|
|
- 基于uni-app框架,一套代码多端运行
|
|||
|
|
- 针对不同业务场景定制化界面
|
|||
|
|
- 支持微信小程序生态集成
|
|||
|
|
- 离线数据缓存和同步机制
|
|||
|
|
|
|||
|
|
#### 2.2.2 网关层 (Gateway Layer)
|
|||
|
|
|
|||
|
|
**负载均衡器 (Nginx):**
|
|||
|
|
- HTTP/HTTPS请求分发
|
|||
|
|
- 静态资源服务和缓存
|
|||
|
|
- SSL证书管理
|
|||
|
|
- 请求限流和防护
|
|||
|
|
|
|||
|
|
**API网关:**
|
|||
|
|
- 统一API入口管理
|
|||
|
|
- 请求路由和转发
|
|||
|
|
- 身份认证和授权
|
|||
|
|
- API版本控制
|
|||
|
|
- 请求日志记录
|
|||
|
|
|
|||
|
|
#### 2.2.3 业务逻辑层 (Business Logic Layer)
|
|||
|
|
|
|||
|
|
**认证服务 (Auth Service):**
|
|||
|
|
- JWT Token管理
|
|||
|
|
- 用户身份验证
|
|||
|
|
- 权限控制和角色管理
|
|||
|
|
- 单点登录(SSO)支持
|
|||
|
|
- 多因子认证(MFA)
|
|||
|
|
|
|||
|
|
**养殖场管理服务 (Farm Service):**
|
|||
|
|
- 养殖场信息CRUD操作
|
|||
|
|
- 地理位置管理
|
|||
|
|
- 证件和资质管理
|
|||
|
|
- 审核流程管理
|
|||
|
|
- 统计数据计算
|
|||
|
|
|
|||
|
|
**设备监控服务 (Device Service):**
|
|||
|
|
- IoT设备连接管理
|
|||
|
|
- 实时数据采集和处理
|
|||
|
|
- 告警规则引擎
|
|||
|
|
- 设备状态监控
|
|||
|
|
- 历史数据存储
|
|||
|
|
|
|||
|
|
**数据分析服务 (Analytics Service):**
|
|||
|
|
- 数据统计和分析
|
|||
|
|
- 报表生成
|
|||
|
|
- 趋势分析
|
|||
|
|
- 数据导出
|
|||
|
|
- 自定义查询
|
|||
|
|
|
|||
|
|
**消息通知服务 (Notification Service):**
|
|||
|
|
- 多渠道消息推送
|
|||
|
|
- 消息模板管理
|
|||
|
|
- 消息队列处理
|
|||
|
|
- 推送状态跟踪
|
|||
|
|
- 消息历史记录
|
|||
|
|
|
|||
|
|
**文件管理服务 (File Service):**
|
|||
|
|
- 文件上传和下载
|
|||
|
|
- 图片处理和压缩
|
|||
|
|
- 文件权限控制
|
|||
|
|
- 云存储集成
|
|||
|
|
- 文件备份管理
|
|||
|
|
|
|||
|
|
#### 2.2.4 数据访问层 (Data Access Layer)
|
|||
|
|
|
|||
|
|
**数据库访问:**
|
|||
|
|
- Sequelize ORM框架
|
|||
|
|
- 数据库连接池管理
|
|||
|
|
- 事务处理
|
|||
|
|
- 数据验证和约束
|
|||
|
|
- 数据库迁移管理
|
|||
|
|
|
|||
|
|
**缓存访问:**
|
|||
|
|
- Redis客户端封装
|
|||
|
|
- 缓存策略管理
|
|||
|
|
- 分布式锁实现
|
|||
|
|
- 会话存储
|
|||
|
|
- 热点数据缓存
|
|||
|
|
|
|||
|
|
#### 2.2.5 数据存储层 (Data Storage Layer)
|
|||
|
|
|
|||
|
|
**关系型数据库 (MySQL):**
|
|||
|
|
- 主从复制架构
|
|||
|
|
- 读写分离
|
|||
|
|
- 数据备份和恢复
|
|||
|
|
- 性能监控和优化
|
|||
|
|
- 数据安全和加密
|
|||
|
|
|
|||
|
|
**缓存数据库 (Redis):**
|
|||
|
|
- 内存数据存储
|
|||
|
|
- 数据持久化
|
|||
|
|
- 集群模式支持
|
|||
|
|
- 高可用配置
|
|||
|
|
- 性能监控
|
|||
|
|
|
|||
|
|
**文件存储 (OSS):**
|
|||
|
|
- 云存储服务
|
|||
|
|
- CDN加速
|
|||
|
|
- 文件备份
|
|||
|
|
- 访问控制
|
|||
|
|
- 成本优化
|
|||
|
|
|
|||
|
|
## 3. 核心模块设计
|
|||
|
|
|
|||
|
|
### 3.1 用户认证与权限模块
|
|||
|
|
|
|||
|
|
#### 3.1.1 认证机制
|
|||
|
|
|
|||
|
|
**JWT Token认证:**
|
|||
|
|
```javascript
|
|||
|
|
// Token结构
|
|||
|
|
{
|
|||
|
|
"header": {
|
|||
|
|
"alg": "HS256",
|
|||
|
|
"typ": "JWT"
|
|||
|
|
},
|
|||
|
|
"payload": {
|
|||
|
|
"userId": 123,
|
|||
|
|
"username": "admin",
|
|||
|
|
"roles": ["admin", "farm_manager"],
|
|||
|
|
"permissions": ["farm:read", "farm:write"],
|
|||
|
|
"exp": 1642694400,
|
|||
|
|
"iat": 1642608000
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**认证流程:**
|
|||
|
|
1. 用户提交登录凭证
|
|||
|
|
2. 服务器验证用户身份
|
|||
|
|
3. 生成JWT Token并返回
|
|||
|
|
4. 客户端存储Token
|
|||
|
|
5. 后续请求携带Token
|
|||
|
|
6. 服务器验证Token有效性
|
|||
|
|
|
|||
|
|
#### 3.1.2 权限控制
|
|||
|
|
|
|||
|
|
**RBAC权限模型:**
|
|||
|
|
- 用户(User) - 角色(Role) - 权限(Permission)
|
|||
|
|
- 支持角色继承和权限组合
|
|||
|
|
- 细粒度权限控制
|
|||
|
|
- 动态权限分配
|
|||
|
|
|
|||
|
|
**权限验证中间件:**
|
|||
|
|
```javascript
|
|||
|
|
const authMiddleware = (requiredPermission) => {
|
|||
|
|
return (req, res, next) => {
|
|||
|
|
const token = req.headers.authorization;
|
|||
|
|
const decoded = jwt.verify(token, secret);
|
|||
|
|
|
|||
|
|
if (hasPermission(decoded.permissions, requiredPermission)) {
|
|||
|
|
req.user = decoded;
|
|||
|
|
next();
|
|||
|
|
} else {
|
|||
|
|
res.status(403).json({ error: 'Insufficient permissions' });
|
|||
|
|
}
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.2 数据采集与处理模块
|
|||
|
|
|
|||
|
|
#### 3.2.1 IoT数据采集
|
|||
|
|
|
|||
|
|
**数据采集架构:**
|
|||
|
|
```mermaid
|
|||
|
|
graph LR
|
|||
|
|
A[IoT设备] --> B[数据网关]
|
|||
|
|
B --> C[消息队列]
|
|||
|
|
C --> D[数据处理服务]
|
|||
|
|
D --> E[数据存储]
|
|||
|
|
D --> F[实时告警]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**数据格式规范:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"deviceId": "DEVICE_001",
|
|||
|
|
"farmId": "FARM_001",
|
|||
|
|
"timestamp": "2025-01-19T10:00:00Z",
|
|||
|
|
"data": {
|
|||
|
|
"temperature": 25.5,
|
|||
|
|
"humidity": 60.2,
|
|||
|
|
"ammonia": 15.8,
|
|||
|
|
"co2": 800
|
|||
|
|
},
|
|||
|
|
"location": {
|
|||
|
|
"latitude": 38.4872,
|
|||
|
|
"longitude": 106.2309
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.2.2 实时数据处理
|
|||
|
|
|
|||
|
|
**流处理架构:**
|
|||
|
|
- 数据接收和验证
|
|||
|
|
- 数据清洗和转换
|
|||
|
|
- 实时计算和分析
|
|||
|
|
- 告警规则匹配
|
|||
|
|
- 数据存储和分发
|
|||
|
|
|
|||
|
|
**告警规则引擎:**
|
|||
|
|
```javascript
|
|||
|
|
const alertRules = [
|
|||
|
|
{
|
|||
|
|
id: 'TEMP_HIGH',
|
|||
|
|
condition: 'temperature > 30',
|
|||
|
|
level: 'warning',
|
|||
|
|
message: '温度过高告警'
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
id: 'AMMONIA_CRITICAL',
|
|||
|
|
condition: 'ammonia > 50',
|
|||
|
|
level: 'critical',
|
|||
|
|
message: '氨气浓度严重超标'
|
|||
|
|
}
|
|||
|
|
];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3.3 数据可视化模块
|
|||
|
|
|
|||
|
|
#### 3.3.1 图表组件设计
|
|||
|
|
|
|||
|
|
**图表类型支持:**
|
|||
|
|
- 折线图:趋势数据展示
|
|||
|
|
- 柱状图:对比数据展示
|
|||
|
|
- 饼图:占比数据展示
|
|||
|
|
- 散点图:相关性分析
|
|||
|
|
- 地图:地理分布展示
|
|||
|
|
- 仪表盘:实时指标展示
|
|||
|
|
|
|||
|
|
**图表配置示例:**
|
|||
|
|
```javascript
|
|||
|
|
const chartConfig = {
|
|||
|
|
type: 'line',
|
|||
|
|
title: '温度趋势图',
|
|||
|
|
xAxis: {
|
|||
|
|
type: 'time',
|
|||
|
|
data: timestamps
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
type: 'value',
|
|||
|
|
name: '温度(°C)'
|
|||
|
|
},
|
|||
|
|
series: [{
|
|||
|
|
name: '温度',
|
|||
|
|
type: 'line',
|
|||
|
|
data: temperatureData,
|
|||
|
|
smooth: true
|
|||
|
|
}]
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 3.3.2 大屏展示设计
|
|||
|
|
|
|||
|
|
**布局设计:**
|
|||
|
|
- 响应式网格布局
|
|||
|
|
- 组件拖拽和调整
|
|||
|
|
- 主题切换支持
|
|||
|
|
- 全屏展示模式
|
|||
|
|
|
|||
|
|
**数据更新机制:**
|
|||
|
|
- WebSocket实时推送
|
|||
|
|
- 定时轮询更新
|
|||
|
|
- 增量数据更新
|
|||
|
|
- 异常处理和重连
|
|||
|
|
|
|||
|
|
## 4. 数据库设计
|
|||
|
|
|
|||
|
|
### 4.1 数据库架构
|
|||
|
|
|
|||
|
|
#### 4.1.1 主从架构
|
|||
|
|
|
|||
|
|
**主库配置:**
|
|||
|
|
- 处理所有写操作
|
|||
|
|
- 实时数据同步到从库
|
|||
|
|
- 自动故障转移
|
|||
|
|
- 性能监控和优化
|
|||
|
|
|
|||
|
|
**从库配置:**
|
|||
|
|
- 处理读操作
|
|||
|
|
- 负载均衡分发
|
|||
|
|
- 数据一致性保证
|
|||
|
|
- 备份和恢复
|
|||
|
|
|
|||
|
|
#### 4.1.2 分库分表策略
|
|||
|
|
|
|||
|
|
**垂直分库:**
|
|||
|
|
- 用户管理库
|
|||
|
|
- 养殖业务库
|
|||
|
|
- 设备数据库
|
|||
|
|
- 日志分析库
|
|||
|
|
|
|||
|
|
**水平分表:**
|
|||
|
|
- 按时间分表:传感器数据表
|
|||
|
|
- 按地区分表:养殖场数据表
|
|||
|
|
- 按用户分表:操作日志表
|
|||
|
|
|
|||
|
|
### 4.2 核心数据表设计
|
|||
|
|
|
|||
|
|
#### 4.2.1 用户相关表
|
|||
|
|
|
|||
|
|
**用户表 (users):**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE users (
|
|||
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|||
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|||
|
|
password_hash VARCHAR(255) NOT NULL,
|
|||
|
|
email VARCHAR(100),
|
|||
|
|
phone VARCHAR(20),
|
|||
|
|
real_name VARCHAR(50),
|
|||
|
|
avatar_url VARCHAR(255),
|
|||
|
|
status ENUM('active', 'inactive', 'banned') DEFAULT 'active',
|
|||
|
|
last_login_at TIMESTAMP,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
INDEX idx_username (username),
|
|||
|
|
INDEX idx_email (email),
|
|||
|
|
INDEX idx_phone (phone)
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**角色表 (roles):**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE roles (
|
|||
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|||
|
|
name VARCHAR(50) UNIQUE NOT NULL,
|
|||
|
|
display_name VARCHAR(100),
|
|||
|
|
description TEXT,
|
|||
|
|
permissions JSON,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.2.2 业务相关表
|
|||
|
|
|
|||
|
|
**养殖场表 (farms):**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE farms (
|
|||
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|||
|
|
name VARCHAR(100) NOT NULL,
|
|||
|
|
code VARCHAR(50) UNIQUE,
|
|||
|
|
type VARCHAR(50),
|
|||
|
|
scale ENUM('small', 'medium', 'large'),
|
|||
|
|
address VARCHAR(200),
|
|||
|
|
latitude DECIMAL(10,8),
|
|||
|
|
longitude DECIMAL(11,8),
|
|||
|
|
contact_person VARCHAR(50),
|
|||
|
|
contact_phone VARCHAR(20),
|
|||
|
|
license_number VARCHAR(100),
|
|||
|
|
status ENUM('active', 'inactive', 'pending') DEFAULT 'pending',
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
INDEX idx_code (code),
|
|||
|
|
INDEX idx_location (latitude, longitude),
|
|||
|
|
INDEX idx_status (status)
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**设备表 (devices):**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE devices (
|
|||
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|||
|
|
farm_id INT NOT NULL,
|
|||
|
|
device_id VARCHAR(100) UNIQUE NOT NULL,
|
|||
|
|
device_name VARCHAR(100),
|
|||
|
|
device_type VARCHAR(50),
|
|||
|
|
model VARCHAR(50),
|
|||
|
|
manufacturer VARCHAR(100),
|
|||
|
|
location VARCHAR(100),
|
|||
|
|
install_date DATE,
|
|||
|
|
status ENUM('online', 'offline', 'maintenance') DEFAULT 'offline',
|
|||
|
|
last_online_at TIMESTAMP,
|
|||
|
|
config JSON,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|||
|
|
FOREIGN KEY (farm_id) REFERENCES farms(id),
|
|||
|
|
INDEX idx_farm_id (farm_id),
|
|||
|
|
INDEX idx_device_id (device_id),
|
|||
|
|
INDEX idx_status (status)
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.2.3 数据相关表
|
|||
|
|
|
|||
|
|
**传感器数据表 (sensor_data):**
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE sensor_data (
|
|||
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|||
|
|
device_id VARCHAR(100) NOT NULL,
|
|||
|
|
farm_id INT NOT NULL,
|
|||
|
|
data_type VARCHAR(50),
|
|||
|
|
value DECIMAL(10,4),
|
|||
|
|
unit VARCHAR(20),
|
|||
|
|
timestamp TIMESTAMP NOT NULL,
|
|||
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
INDEX idx_device_timestamp (device_id, timestamp),
|
|||
|
|
INDEX idx_farm_timestamp (farm_id, timestamp),
|
|||
|
|
INDEX idx_type_timestamp (data_type, timestamp)
|
|||
|
|
) PARTITION BY RANGE (UNIX_TIMESTAMP(timestamp)) (
|
|||
|
|
PARTITION p202501 VALUES LESS THAN (UNIX_TIMESTAMP('2025-02-01')),
|
|||
|
|
PARTITION p202502 VALUES LESS THAN (UNIX_TIMESTAMP('2025-03-01')),
|
|||
|
|
PARTITION p202503 VALUES LESS THAN (UNIX_TIMESTAMP('2025-04-01'))
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.3 数据库优化策略
|
|||
|
|
|
|||
|
|
#### 4.3.1 索引优化
|
|||
|
|
|
|||
|
|
**索引设计原则:**
|
|||
|
|
- 为查询频繁的字段创建索引
|
|||
|
|
- 复合索引遵循最左前缀原则
|
|||
|
|
- 避免过多索引影响写性能
|
|||
|
|
- 定期分析索引使用情况
|
|||
|
|
|
|||
|
|
**索引监控:**
|
|||
|
|
```sql
|
|||
|
|
-- 查看索引使用情况
|
|||
|
|
SELECT
|
|||
|
|
table_name,
|
|||
|
|
index_name,
|
|||
|
|
cardinality,
|
|||
|
|
non_unique
|
|||
|
|
FROM information_schema.statistics
|
|||
|
|
WHERE table_schema = 'nxxmdata';
|
|||
|
|
|
|||
|
|
-- 查看慢查询
|
|||
|
|
SELECT
|
|||
|
|
query_time,
|
|||
|
|
lock_time,
|
|||
|
|
rows_sent,
|
|||
|
|
rows_examined,
|
|||
|
|
sql_text
|
|||
|
|
FROM mysql.slow_log
|
|||
|
|
ORDER BY query_time DESC
|
|||
|
|
LIMIT 10;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 4.3.2 查询优化
|
|||
|
|
|
|||
|
|
**查询优化技巧:**
|
|||
|
|
- 使用EXPLAIN分析查询计划
|
|||
|
|
- 避免SELECT *,只查询需要的字段
|
|||
|
|
- 合理使用JOIN和子查询
|
|||
|
|
- 利用缓存减少数据库访问
|
|||
|
|
|
|||
|
|
**分页查询优化:**
|
|||
|
|
```sql
|
|||
|
|
-- 传统分页(性能差)
|
|||
|
|
SELECT * FROM sensor_data
|
|||
|
|
ORDER BY timestamp DESC
|
|||
|
|
LIMIT 1000, 20;
|
|||
|
|
|
|||
|
|
-- 优化后分页(性能好)
|
|||
|
|
SELECT * FROM sensor_data
|
|||
|
|
WHERE id < last_id
|
|||
|
|
ORDER BY id DESC
|
|||
|
|
LIMIT 20;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 5. 缓存架构设计
|
|||
|
|
|
|||
|
|
### 5.1 缓存策略
|
|||
|
|
|
|||
|
|
#### 5.1.1 多级缓存架构
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
A[客户端] --> B[CDN缓存]
|
|||
|
|
B --> C[Nginx缓存]
|
|||
|
|
C --> D[应用缓存]
|
|||
|
|
D --> E[Redis缓存]
|
|||
|
|
E --> F[数据库]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**缓存层级说明:**
|
|||
|
|
- **CDN缓存**: 静态资源缓存,就近访问
|
|||
|
|
- **Nginx缓存**: 反向代理缓存,减少后端压力
|
|||
|
|
- **应用缓存**: 内存缓存,提升响应速度
|
|||
|
|
- **Redis缓存**: 分布式缓存,数据共享
|
|||
|
|
|
|||
|
|
#### 5.1.2 缓存模式
|
|||
|
|
|
|||
|
|
**Cache-Aside模式:**
|
|||
|
|
```javascript
|
|||
|
|
async function getFarmData(farmId) {
|
|||
|
|
// 1. 先查缓存
|
|||
|
|
let data = await redis.get(`farm:${farmId}`);
|
|||
|
|
|
|||
|
|
if (data) {
|
|||
|
|
return JSON.parse(data);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. 缓存未命中,查数据库
|
|||
|
|
data = await Farm.findById(farmId);
|
|||
|
|
|
|||
|
|
// 3. 写入缓存
|
|||
|
|
await redis.setex(`farm:${farmId}`, 3600, JSON.stringify(data));
|
|||
|
|
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Write-Through模式:**
|
|||
|
|
```javascript
|
|||
|
|
async function updateFarmData(farmId, updateData) {
|
|||
|
|
// 1. 更新数据库
|
|||
|
|
const data = await Farm.update(updateData, { where: { id: farmId } });
|
|||
|
|
|
|||
|
|
// 2. 同时更新缓存
|
|||
|
|
await redis.setex(`farm:${farmId}`, 3600, JSON.stringify(data));
|
|||
|
|
|
|||
|
|
return data;
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 5.2 缓存设计
|
|||
|
|
|
|||
|
|
#### 5.2.1 缓存键设计
|
|||
|
|
|
|||
|
|
**命名规范:**
|
|||
|
|
```
|
|||
|
|
业务模块:实体类型:标识符[:附加信息]
|
|||
|
|
|
|||
|
|
示例:
|
|||
|
|
- user:profile:123
|
|||
|
|
- farm:info:456
|
|||
|
|
- device:status:789
|
|||
|
|
- stats:daily:2025-01-19
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**过期策略:**
|
|||
|
|
- 用户会话:24小时
|
|||
|
|
- 基础数据:1小时
|
|||
|
|
- 统计数据:30分钟
|
|||
|
|
- 实时数据:5分钟
|
|||
|
|
|
|||
|
|
#### 5.2.2 缓存更新策略
|
|||
|
|
|
|||
|
|
**主动更新:**
|
|||
|
|
- 数据变更时立即更新缓存
|
|||
|
|
- 定时任务批量更新
|
|||
|
|
- 版本号控制缓存一致性
|
|||
|
|
|
|||
|
|
**被动更新:**
|
|||
|
|
- 缓存过期自动失效
|
|||
|
|
- LRU算法淘汰冷数据
|
|||
|
|
- 内存不足时清理缓存
|
|||
|
|
|
|||
|
|
## 6. 消息队列设计
|
|||
|
|
|
|||
|
|
### 6.1 消息队列架构
|
|||
|
|
|
|||
|
|
#### 6.1.1 队列类型
|
|||
|
|
|
|||
|
|
**实时数据队列:**
|
|||
|
|
- 处理IoT设备数据
|
|||
|
|
- 高吞吐量,低延迟
|
|||
|
|
- 数据持久化保证
|
|||
|
|
|
|||
|
|
**告警通知队列:**
|
|||
|
|
- 处理系统告警
|
|||
|
|
- 优先级队列
|
|||
|
|
- 失败重试机制
|
|||
|
|
|
|||
|
|
**异步任务队列:**
|
|||
|
|
- 处理耗时任务
|
|||
|
|
- 任务调度和监控
|
|||
|
|
- 结果回调通知
|
|||
|
|
|
|||
|
|
#### 6.1.2 消息格式
|
|||
|
|
|
|||
|
|
**标准消息格式:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"messageId": "msg_123456",
|
|||
|
|
"type": "sensor_data",
|
|||
|
|
"priority": "normal",
|
|||
|
|
"timestamp": "2025-01-19T10:00:00Z",
|
|||
|
|
"source": "device_001",
|
|||
|
|
"target": "data_processor",
|
|||
|
|
"payload": {
|
|||
|
|
"deviceId": "device_001",
|
|||
|
|
"data": {
|
|||
|
|
"temperature": 25.5,
|
|||
|
|
"humidity": 60.2
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
"metadata": {
|
|||
|
|
"retryCount": 0,
|
|||
|
|
"maxRetries": 3,
|
|||
|
|
"ttl": 3600
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 6.2 消息处理
|
|||
|
|
|
|||
|
|
#### 6.2.1 生产者设计
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
class MessageProducer {
|
|||
|
|
constructor(queueName) {
|
|||
|
|
this.queueName = queueName;
|
|||
|
|
this.connection = createConnection();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async sendMessage(message) {
|
|||
|
|
const messageWithId = {
|
|||
|
|
...message,
|
|||
|
|
messageId: generateId(),
|
|||
|
|
timestamp: new Date().toISOString()
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
await this.connection.publish(
|
|||
|
|
this.queueName,
|
|||
|
|
JSON.stringify(messageWithId)
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 6.2.2 消费者设计
|
|||
|
|
|
|||
|
|
```javascript
|
|||
|
|
class MessageConsumer {
|
|||
|
|
constructor(queueName, handler) {
|
|||
|
|
this.queueName = queueName;
|
|||
|
|
this.handler = handler;
|
|||
|
|
this.connection = createConnection();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async startConsuming() {
|
|||
|
|
await this.connection.consume(this.queueName, async (message) => {
|
|||
|
|
try {
|
|||
|
|
const data = JSON.parse(message.content);
|
|||
|
|
await this.handler(data);
|
|||
|
|
this.connection.ack(message);
|
|||
|
|
} catch (error) {
|
|||
|
|
console.error('Message processing failed:', error);
|
|||
|
|
this.connection.nack(message, false, true);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 7. 安全架构设计
|
|||
|
|
|
|||
|
|
### 7.1 安全防护体系
|
|||
|
|
|
|||
|
|
#### 7.1.1 网络安全
|
|||
|
|
|
|||
|
|
**防火墙配置:**
|
|||
|
|
- 端口访问控制
|
|||
|
|
- IP白名单机制
|
|||
|
|
- DDoS攻击防护
|
|||
|
|
- 流量监控和分析
|
|||
|
|
|
|||
|
|
**SSL/TLS加密:**
|
|||
|
|
- HTTPS强制跳转
|
|||
|
|
- 证书自动更新
|
|||
|
|
- 加密算法升级
|
|||
|
|
- 安全头配置
|
|||
|
|
|
|||
|
|
#### 7.1.2 应用安全
|
|||
|
|
|
|||
|
|
**输入验证:**
|
|||
|
|
```javascript
|
|||
|
|
const validateInput = (schema) => {
|
|||
|
|
return (req, res, next) => {
|
|||
|
|
const { error } = schema.validate(req.body);
|
|||
|
|
if (error) {
|
|||
|
|
return res.status(400).json({
|
|||
|
|
error: 'Validation failed',
|
|||
|
|
details: error.details
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
next();
|
|||
|
|
};
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**SQL注入防护:**
|
|||
|
|
```javascript
|
|||
|
|
// 使用参数化查询
|
|||
|
|
const getUserById = async (userId) => {
|
|||
|
|
return await User.findOne({
|
|||
|
|
where: { id: userId } // Sequelize自动转义
|
|||
|
|
});
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**XSS防护:**
|
|||
|
|
```javascript
|
|||
|
|
const helmet = require('helmet');
|
|||
|
|
app.use(helmet({
|
|||
|
|
contentSecurityPolicy: {
|
|||
|
|
directives: {
|
|||
|
|
defaultSrc: ["'self'"],
|
|||
|
|
scriptSrc: ["'self'", "'unsafe-inline'"],
|
|||
|
|
styleSrc: ["'self'", "'unsafe-inline'"]
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}));
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7.2 数据安全
|
|||
|
|
|
|||
|
|
#### 7.2.1 数据加密
|
|||
|
|
|
|||
|
|
**敏感数据加密:**
|
|||
|
|
```javascript
|
|||
|
|
const crypto = require('crypto');
|
|||
|
|
|
|||
|
|
class DataEncryption {
|
|||
|
|
constructor(key) {
|
|||
|
|
this.key = key;
|
|||
|
|
this.algorithm = 'aes-256-gcm';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
encrypt(text) {
|
|||
|
|
const iv = crypto.randomBytes(16);
|
|||
|
|
const cipher = crypto.createCipher(this.algorithm, this.key, iv);
|
|||
|
|
|
|||
|
|
let encrypted = cipher.update(text, 'utf8', 'hex');
|
|||
|
|
encrypted += cipher.final('hex');
|
|||
|
|
|
|||
|
|
const authTag = cipher.getAuthTag();
|
|||
|
|
|
|||
|
|
return {
|
|||
|
|
encrypted,
|
|||
|
|
iv: iv.toString('hex'),
|
|||
|
|
authTag: authTag.toString('hex')
|
|||
|
|
};
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
decrypt(encryptedData) {
|
|||
|
|
const decipher = crypto.createDecipher(
|
|||
|
|
this.algorithm,
|
|||
|
|
this.key,
|
|||
|
|
Buffer.from(encryptedData.iv, 'hex')
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
decipher.setAuthTag(Buffer.from(encryptedData.authTag, 'hex'));
|
|||
|
|
|
|||
|
|
let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8');
|
|||
|
|
decrypted += decipher.final('utf8');
|
|||
|
|
|
|||
|
|
return decrypted;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 7.2.2 访问控制
|
|||
|
|
|
|||
|
|
**权限矩阵:**
|
|||
|
|
| 角色 | 养殖场管理 | 设备监控 | 数据分析 | 用户管理 |
|
|||
|
|
|------|------------|----------|----------|----------|
|
|||
|
|
| 系统管理员 | ✓ | ✓ | ✓ | ✓ |
|
|||
|
|
| 监管人员 | ✓ | ✓ | ✓ | ✗ |
|
|||
|
|
| 养殖场管理员 | ✓ | ✓ | ✓ | ✗ |
|
|||
|
|
| 养殖场员工 | ✓ | ✓ | ✗ | ✗ |
|
|||
|
|
|
|||
|
|
**数据脱敏:**
|
|||
|
|
```javascript
|
|||
|
|
const maskSensitiveData = (data, userRole) => {
|
|||
|
|
if (userRole !== 'admin') {
|
|||
|
|
// 脱敏处理
|
|||
|
|
data.phone = data.phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
|
|||
|
|
data.idCard = data.idCard.replace(/(\d{6})\d{8}(\d{4})/, '$1********$2');
|
|||
|
|
}
|
|||
|
|
return data;
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 8. 监控与运维
|
|||
|
|
|
|||
|
|
### 8.1 系统监控
|
|||
|
|
|
|||
|
|
#### 8.1.1 监控指标
|
|||
|
|
|
|||
|
|
**系统指标:**
|
|||
|
|
- CPU使用率
|
|||
|
|
- 内存使用率
|
|||
|
|
- 磁盘I/O
|
|||
|
|
- 网络流量
|
|||
|
|
- 进程状态
|
|||
|
|
|
|||
|
|
**应用指标:**
|
|||
|
|
- 请求响应时间
|
|||
|
|
- 错误率
|
|||
|
|
- 吞吐量
|
|||
|
|
- 并发用户数
|
|||
|
|
- 队列长度
|
|||
|
|
|
|||
|
|
**业务指标:**
|
|||
|
|
- 用户活跃度
|
|||
|
|
- 功能使用率
|
|||
|
|
- 数据准确性
|
|||
|
|
- 告警处理时间
|
|||
|
|
|
|||
|
|
#### 8.1.2 监控实现
|
|||
|
|
|
|||
|
|
**Prometheus配置:**
|
|||
|
|
```yaml
|
|||
|
|
global:
|
|||
|
|
scrape_interval: 15s
|
|||
|
|
evaluation_interval: 15s
|
|||
|
|
|
|||
|
|
scrape_configs:
|
|||
|
|
- job_name: 'node-exporter'
|
|||
|
|
static_configs:
|
|||
|
|
- targets: ['localhost:9100']
|
|||
|
|
|
|||
|
|
- job_name: 'mysql-exporter'
|
|||
|
|
static_configs:
|
|||
|
|
- targets: ['localhost:9104']
|
|||
|
|
|
|||
|
|
- job_name: 'redis-exporter'
|
|||
|
|
static_configs:
|
|||
|
|
- targets: ['localhost:9121']
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Grafana仪表盘:**
|
|||
|
|
- 系统资源监控
|
|||
|
|
- 应用性能监控
|
|||
|
|
- 业务数据监控
|
|||
|
|
- 告警状态监控
|
|||
|
|
|
|||
|
|
### 8.2 日志管理
|
|||
|
|
|
|||
|
|
#### 8.2.1 日志分类
|
|||
|
|
|
|||
|
|
**应用日志:**
|
|||
|
|
- 访问日志
|
|||
|
|
- 错误日志
|
|||
|
|
- 业务日志
|
|||
|
|
- 调试日志
|
|||
|
|
|
|||
|
|
**系统日志:**
|
|||
|
|
- 系统事件日志
|
|||
|
|
- 安全日志
|
|||
|
|
- 性能日志
|
|||
|
|
- 审计日志
|
|||
|
|
|
|||
|
|
#### 8.2.2 日志格式
|
|||
|
|
|
|||
|
|
**结构化日志格式:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"timestamp": "2025-01-19T10:00:00Z",
|
|||
|
|
"level": "INFO",
|
|||
|
|
"service": "farm-service",
|
|||
|
|
"traceId": "trace_123456",
|
|||
|
|
"userId": "user_789",
|
|||
|
|
"action": "create_farm",
|
|||
|
|
"message": "Farm created successfully",
|
|||
|
|
"data": {
|
|||
|
|
"farmId": "farm_001",
|
|||
|
|
"farmName": "示例养殖场"
|
|||
|
|
},
|
|||
|
|
"duration": 150,
|
|||
|
|
"ip": "192.168.1.100",
|
|||
|
|
"userAgent": "Mozilla/5.0..."
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8.3 备份与恢复
|
|||
|
|
|
|||
|
|
#### 8.3.1 备份策略
|
|||
|
|
|
|||
|
|
**数据库备份:**
|
|||
|
|
- 全量备份:每日凌晨执行
|
|||
|
|
- 增量备份:每小时执行
|
|||
|
|
- 二进制日志备份:实时备份
|
|||
|
|
- 异地备份:每周同步
|
|||
|
|
|
|||
|
|
**文件备份:**
|
|||
|
|
- 应用代码备份
|
|||
|
|
- 配置文件备份
|
|||
|
|
- 日志文件备份
|
|||
|
|
- 用户上传文件备份
|
|||
|
|
|
|||
|
|
#### 8.3.2 恢复流程
|
|||
|
|
|
|||
|
|
**数据恢复步骤:**
|
|||
|
|
1. 评估故障范围和影响
|
|||
|
|
2. 选择合适的备份点
|
|||
|
|
3. 停止相关服务
|
|||
|
|
4. 执行数据恢复
|
|||
|
|
5. 验证数据完整性
|
|||
|
|
6. 重启服务并测试
|
|||
|
|
7. 通知相关人员
|
|||
|
|
|
|||
|
|
## 9. 性能优化
|
|||
|
|
|
|||
|
|
### 9.1 前端性能优化
|
|||
|
|
|
|||
|
|
#### 9.1.1 资源优化
|
|||
|
|
|
|||
|
|
**代码分割:**
|
|||
|
|
```javascript
|
|||
|
|
// 路由懒加载
|
|||
|
|
const routes = [
|
|||
|
|
{
|
|||
|
|
path: '/farm',
|
|||
|
|
component: () => import('@/views/Farm.vue')
|
|||
|
|
},
|
|||
|
|
{
|
|||
|
|
path: '/device',
|
|||
|
|
component: () => import('@/views/Device.vue')
|
|||
|
|
}
|
|||
|
|
];
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**资源压缩:**
|
|||
|
|
```javascript
|
|||
|
|
// Vite配置
|
|||
|
|
export default defineConfig({
|
|||
|
|
build: {
|
|||
|
|
rollupOptions: {
|
|||
|
|
output: {
|
|||
|
|
manualChunks: {
|
|||
|
|
vendor: ['vue', 'vue-router', 'pinia'],
|
|||
|
|
antd: ['ant-design-vue'],
|
|||
|
|
charts: ['echarts']
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
minify: 'terser',
|
|||
|
|
terserOptions: {
|
|||
|
|
compress: {
|
|||
|
|
drop_console: true,
|
|||
|
|
drop_debugger: true
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 9.1.2 渲染优化
|
|||
|
|
|
|||
|
|
**虚拟滚动:**
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<VirtualList
|
|||
|
|
:items="largeDataList"
|
|||
|
|
:item-height="50"
|
|||
|
|
:container-height="400"
|
|||
|
|
>
|
|||
|
|
<template #item="{ item }">
|
|||
|
|
<div class="list-item">{{ item.name }}</div>
|
|||
|
|
</template>
|
|||
|
|
</VirtualList>
|
|||
|
|
</template>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**图片懒加载:**
|
|||
|
|
```vue
|
|||
|
|
<template>
|
|||
|
|
<img
|
|||
|
|
v-lazy="imageUrl"
|
|||
|
|
:alt="imageAlt"
|
|||
|
|
class="lazy-image"
|
|||
|
|
/>
|
|||
|
|
</template>
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 9.2 后端性能优化
|
|||
|
|
|
|||
|
|
#### 9.2.1 数据库优化
|
|||
|
|
|
|||
|
|
**连接池配置:**
|
|||
|
|
```javascript
|
|||
|
|
const sequelize = new Sequelize(database, username, password, {
|
|||
|
|
host: 'localhost',
|
|||
|
|
dialect: 'mysql',
|
|||
|
|
pool: {
|
|||
|
|
max: 20, // 最大连接数
|
|||
|
|
min: 5, // 最小连接数
|
|||
|
|
acquire: 30000, // 获取连接超时时间
|
|||
|
|
idle: 10000 // 连接空闲时间
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**查询优化:**
|
|||
|
|
```javascript
|
|||
|
|
// 使用索引优化查询
|
|||
|
|
const farms = await Farm.findAll({
|
|||
|
|
where: {
|
|||
|
|
status: 'active',
|
|||
|
|
createdAt: {
|
|||
|
|
[Op.gte]: startDate,
|
|||
|
|
[Op.lte]: endDate
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
include: [{
|
|||
|
|
model: Device,
|
|||
|
|
where: { status: 'online' },
|
|||
|
|
required: false
|
|||
|
|
}],
|
|||
|
|
order: [['createdAt', 'DESC']],
|
|||
|
|
limit: 20,
|
|||
|
|
offset: page * 20
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 9.2.2 缓存优化
|
|||
|
|
|
|||
|
|
**多级缓存:**
|
|||
|
|
```javascript
|
|||
|
|
class CacheManager {
|
|||
|
|
constructor() {
|
|||
|
|
this.l1Cache = new Map(); // 内存缓存
|
|||
|
|
this.l2Cache = redis; // Redis缓存
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async get(key) {
|
|||
|
|
// L1缓存查找
|
|||
|
|
if (this.l1Cache.has(key)) {
|
|||
|
|
return this.l1Cache.get(key);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// L2缓存查找
|
|||
|
|
const value = await this.l2Cache.get(key);
|
|||
|
|
if (value) {
|
|||
|
|
this.l1Cache.set(key, value);
|
|||
|
|
return value;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async set(key, value, ttl = 3600) {
|
|||
|
|
this.l1Cache.set(key, value);
|
|||
|
|
await this.l2Cache.setex(key, ttl, value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 10. 扩展性设计
|
|||
|
|
|
|||
|
|
### 10.1 微服务架构演进
|
|||
|
|
|
|||
|
|
#### 10.1.1 服务拆分策略
|
|||
|
|
|
|||
|
|
**按业务领域拆分:**
|
|||
|
|
- 用户服务 (User Service)
|
|||
|
|
- 养殖场服务 (Farm Service)
|
|||
|
|
- 设备服务 (Device Service)
|
|||
|
|
- 数据分析服务 (Analytics Service)
|
|||
|
|
- 通知服务 (Notification Service)
|
|||
|
|
|
|||
|
|
**服务边界定义:**
|
|||
|
|
```mermaid
|
|||
|
|
graph TB
|
|||
|
|
subgraph "用户域"
|
|||
|
|
A[用户服务]
|
|||
|
|
B[认证服务]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "业务域"
|
|||
|
|
C[养殖场服务]
|
|||
|
|
D[动物管理服务]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "设备域"
|
|||
|
|
E[设备管理服务]
|
|||
|
|
F[数据采集服务]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
subgraph "分析域"
|
|||
|
|
G[数据分析服务]
|
|||
|
|
H[报表服务]
|
|||
|
|
end
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 10.1.2 服务通信
|
|||
|
|
|
|||
|
|
**同步通信 (HTTP/REST):**
|
|||
|
|
```javascript
|
|||
|
|
// 服务间调用
|
|||
|
|
class FarmService {
|
|||
|
|
async getFarmDevices(farmId) {
|
|||
|
|
const response = await axios.get(
|
|||
|
|
`${DEVICE_SERVICE_URL}/devices?farmId=${farmId}`
|
|||
|
|
);
|
|||
|
|
return response.data;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**异步通信 (消息队列):**
|
|||
|
|
```javascript
|
|||
|
|
// 事件发布
|
|||
|
|
class FarmService {
|
|||
|
|
async createFarm(farmData) {
|
|||
|
|
const farm = await Farm.create(farmData);
|
|||
|
|
|
|||
|
|
// 发布农场创建事件
|
|||
|
|
await eventBus.publish('farm.created', {
|
|||
|
|
farmId: farm.id,
|
|||
|
|
farmName: farm.name,
|
|||
|
|
timestamp: new Date()
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
return farm;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 事件订阅
|
|||
|
|
class NotificationService {
|
|||
|
|
constructor() {
|
|||
|
|
eventBus.subscribe('farm.created', this.handleFarmCreated.bind(this));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
async handleFarmCreated(event) {
|
|||
|
|
// 发送欢迎通知
|
|||
|
|
await this.sendWelcomeNotification(event.farmId);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 10.2 容器化部署
|
|||
|
|
|
|||
|
|
#### 10.2.1 Docker配置
|
|||
|
|
|
|||
|
|
**应用Dockerfile:**
|
|||
|
|
```dockerfile
|
|||
|
|
FROM node:16-alpine
|
|||
|
|
|
|||
|
|
WORKDIR /app
|
|||
|
|
|
|||
|
|
# 复制依赖文件
|
|||
|
|
COPY package*.json ./
|
|||
|
|
RUN npm ci --only=production
|
|||
|
|
|
|||
|
|
# 复制应用代码
|
|||
|
|
COPY . .
|
|||
|
|
|
|||
|
|
# 创建非root用户
|
|||
|
|
RUN addgroup -g 1001 -S nodejs
|
|||
|
|
RUN adduser -S nodejs -u 1001
|
|||
|
|
|
|||
|
|
USER nodejs
|
|||
|
|
|
|||
|
|
EXPOSE 3000
|
|||
|
|
|
|||
|
|
CMD ["npm", "start"]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Docker Compose配置:**
|
|||
|
|
```yaml
|
|||
|
|
version: '3.8'
|
|||
|
|
|
|||
|
|
services:
|
|||
|
|
app:
|
|||
|
|
build: .
|
|||
|
|
ports:
|
|||
|
|
- "3000:3000"
|
|||
|
|
environment:
|
|||
|
|
- NODE_ENV=production
|
|||
|
|
- DB_HOST=mysql
|
|||
|
|
- REDIS_HOST=redis
|
|||
|
|
depends_on:
|
|||
|
|
- mysql
|
|||
|
|
- redis
|
|||
|
|
restart: unless-stopped
|
|||
|
|
|
|||
|
|
mysql:
|
|||
|
|
image: mysql:8.0
|
|||
|
|
environment:
|
|||
|
|
- MYSQL_ROOT_PASSWORD=rootpassword
|
|||
|
|
- MYSQL_DATABASE=nxxmdata
|
|||
|
|
volumes:
|
|||
|
|
- mysql_data:/var/lib/mysql
|
|||
|
|
restart: unless-stopped
|
|||
|
|
|
|||
|
|
redis:
|
|||
|
|
image: redis:6-alpine
|
|||
|
|
volumes:
|
|||
|
|
- redis_data:/data
|
|||
|
|
restart: unless-stopped
|
|||
|
|
|
|||
|
|
nginx:
|
|||
|
|
image: nginx:alpine
|
|||
|
|
ports:
|
|||
|
|
- "80:80"
|
|||
|
|
- "443:443"
|
|||
|
|
volumes:
|
|||
|
|
- ./nginx.conf:/etc/nginx/nginx.conf
|
|||
|
|
- ./ssl:/etc/nginx/ssl
|
|||
|
|
depends_on:
|
|||
|
|
- app
|
|||
|
|
restart: unless-stopped
|
|||
|
|
|
|||
|
|
volumes:
|
|||
|
|
mysql_data:
|
|||
|
|
redis_data:
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 10.2.2 Kubernetes部署
|
|||
|
|
|
|||
|
|
**应用部署配置:**
|
|||
|
|
```yaml
|
|||
|
|
apiVersion: apps/v1
|
|||
|
|
kind: Deployment
|
|||
|
|
metadata:
|
|||
|
|
name: nxxmdata-app
|
|||
|
|
spec:
|
|||
|
|
replicas: 3
|
|||
|
|
selector:
|
|||
|
|
matchLabels:
|
|||
|
|
app: nxxmdata-app
|
|||
|
|
template:
|
|||
|
|
metadata:
|
|||
|
|
labels:
|
|||
|
|
app: nxxmdata-app
|
|||
|
|
spec:
|
|||
|
|
containers:
|
|||
|
|
- name: app
|
|||
|
|
image: nxxmdata:latest
|
|||
|
|
ports:
|
|||
|
|
- containerPort: 3000
|
|||
|
|
env:
|
|||
|
|
- name: NODE_ENV
|
|||
|
|
value: "production"
|
|||
|
|
- name: DB_HOST
|
|||
|
|
value: "mysql-service"
|
|||
|
|
resources:
|
|||
|
|
requests:
|
|||
|
|
memory: "256Mi"
|
|||
|
|
cpu: "250m"
|
|||
|
|
limits:
|
|||
|
|
memory: "512Mi"
|
|||
|
|
cpu: "500m"
|
|||
|
|
livenessProbe:
|
|||
|
|
httpGet:
|
|||
|
|
path: /health
|
|||
|
|
port: 3000
|
|||
|
|
initialDelaySeconds: 30
|
|||
|
|
periodSeconds: 10
|
|||
|
|
readinessProbe:
|
|||
|
|
httpGet:
|
|||
|
|
path: /ready
|
|||
|
|
port: 3000
|
|||
|
|
initialDelaySeconds: 5
|
|||
|
|
periodSeconds: 5
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 11. 技术债务管理
|
|||
|
|
|
|||
|
|
### 11.1 代码质量
|
|||
|
|
|
|||
|
|
#### 11.1.1 代码规范
|
|||
|
|
|
|||
|
|
**ESLint配置:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"extends": [
|
|||
|
|
"eslint:recommended",
|
|||
|
|
"@vue/typescript/recommended"
|
|||
|
|
],
|
|||
|
|
"rules": {
|
|||
|
|
"no-console": "warn",
|
|||
|
|
"no-debugger": "error",
|
|||
|
|
"prefer-const": "error",
|
|||
|
|
"no-var": "error"
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**代码审查流程:**
|
|||
|
|
1. 开发人员提交PR
|
|||
|
|
2. 自动化测试执行
|
|||
|
|
3. 代码质量检查
|
|||
|
|
4. 同行代码审查
|
|||
|
|
5. 技术负责人审批
|
|||
|
|
6. 合并到主分支
|
|||
|
|
|
|||
|
|
#### 11.1.2 技术债务识别
|
|||
|
|
|
|||
|
|
**债务类型:**
|
|||
|
|
- 代码重复
|
|||
|
|
- 复杂度过高
|
|||
|
|
- 测试覆盖率不足
|
|||
|
|
- 文档缺失
|
|||
|
|
- 性能问题
|
|||
|
|
|
|||
|
|
**债务评估:**
|
|||
|
|
```javascript
|
|||
|
|
// 使用SonarQube进行代码质量分析
|
|||
|
|
const qualityGate = {
|
|||
|
|
coverage: '>= 80%',
|
|||
|
|
duplicatedLines: '<= 3%',
|
|||
|
|
maintainabilityRating: 'A',
|
|||
|
|
reliabilityRating: 'A',
|
|||
|
|
securityRating: 'A'
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 11.2 重构策略
|
|||
|
|
|
|||
|
|
#### 11.2.1 渐进式重构
|
|||
|
|
|
|||
|
|
**重构原则:**
|
|||
|
|
- 小步快跑,频繁重构
|
|||
|
|
- 保持功能不变
|
|||
|
|
- 增加测试覆盖
|
|||
|
|
- 文档同步更新
|
|||
|
|
|
|||
|
|
**重构计划:**
|
|||
|
|
1. 识别重构目标
|
|||
|
|
2. 编写测试用例
|
|||
|
|
3. 小范围重构
|
|||
|
|
4. 验证功能正确性
|
|||
|
|
5. 部署到测试环境
|
|||
|
|
6. 生产环境发布
|
|||
|
|
|
|||
|
|
## 12. 未来规划
|
|||
|
|
|
|||
|
|
### 12.1 技术演进路线
|
|||
|
|
|
|||
|
|
#### 12.1.1 短期规划 (6个月内)
|
|||
|
|
|
|||
|
|
**技术优化:**
|
|||
|
|
- 完善监控体系
|
|||
|
|
- 优化数据库性能
|
|||
|
|
- 增强安全防护
|
|||
|
|
- 提升系统稳定性
|
|||
|
|
|
|||
|
|
**功能扩展:**
|
|||
|
|
- 移动端APP开发
|
|||
|
|
- 数据分析增强
|
|||
|
|
- 第三方系统集成
|
|||
|
|
- 用户体验优化
|
|||
|
|
|
|||
|
|
#### 12.1.2 中期规划 (1年内)
|
|||
|
|
|
|||
|
|
**架构升级:**
|
|||
|
|
- 微服务架构改造
|
|||
|
|
- 容器化部署
|
|||
|
|
- 云原生架构
|
|||
|
|
- DevOps流程完善
|
|||
|
|
|
|||
|
|
**技术创新:**
|
|||
|
|
- 人工智能集成
|
|||
|
|
- 物联网平台扩展
|
|||
|
|
- 区块链溯源
|
|||
|
|
- 边缘计算应用
|
|||
|
|
|
|||
|
|
#### 12.1.3 长期规划 (2-3年)
|
|||
|
|
|
|||
|
|
**平台化发展:**
|
|||
|
|
- 开放API平台
|
|||
|
|
- 生态系统建设
|
|||
|
|
- 行业标准制定
|
|||
|
|
- 国际化扩展
|
|||
|
|
|
|||
|
|
**技术前沿:**
|
|||
|
|
- 5G网络应用
|
|||
|
|
- 数字孪生技术
|
|||
|
|
- 量子计算探索
|
|||
|
|
- 绿色计算实践
|
|||
|
|
|
|||
|
|
### 12.2 风险评估
|
|||
|
|
|
|||
|
|
#### 12.2.1 技术风险
|
|||
|
|
|
|||
|
|
**风险识别:**
|
|||
|
|
- 技术栈过时风险
|
|||
|
|
- 第三方依赖风险
|
|||
|
|
- 安全漏洞风险
|
|||
|
|
- 性能瓶颈风险
|
|||
|
|
|
|||
|
|
**应对措施:**
|
|||
|
|
- 定期技术评估
|
|||
|
|
- 依赖版本管理
|
|||
|
|
- 安全扫描机制
|
|||
|
|
- 性能监控预警
|
|||
|
|
|
|||
|
|
#### 12.2.2 业务风险
|
|||
|
|
|
|||
|
|
**风险识别:**
|
|||
|
|
- 需求变更风险
|
|||
|
|
- 竞争对手风险
|
|||
|
|
- 政策法规风险
|
|||
|
|
- 市场环境风险
|
|||
|
|
|
|||
|
|
**应对措施:**
|
|||
|
|
- 敏捷开发模式
|
|||
|
|
- 差异化竞争
|
|||
|
|
- 合规性保证
|
|||
|
|
- 市场调研分析
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**文档维护说明:**
|
|||
|
|
- 本文档将根据技术发展和业务需求定期更新
|
|||
|
|
- 架构变更需经过技术委员会评审
|
|||
|
|
- 重大架构调整需要影响评估和风险分析
|
|||
|
|
- 相关技术人员需及时同步架构变更
|
|||
|
|
|
|||
|
|
*最后更新时间:2025-01-19*
|
|||
|
|
*文档版本:v2.0*
|
|||
|
|
*维护人员:架构师*
|