后端架构
约 3833 字大约 13 分钟
2025-12-27
1. 架构概述
1.1 整体架构设计
联犀物联网平台采用分层架构设计,实现设备、云端服务和客户端的高效协同。平台支持多租户、多项目管理,可灵活部署为单体或微服务模式,适应不同规模的物联网应用场景。
1.2 核心组件
| 组件 | 功能描述 | 实现服务 |
|---|---|---|
| 设备网关层 | 设备连接管理、认证、消息路由 | dgsvr |
| 设备管理层 | 设备生命周期管理、数据处理、命令下发 | dmsvr |
| API网关层 | 客户端接口服务、权限控制 | apisvr |
| 数据存储层 | 持久化存储、时序数据处理 | MySQL/TDengine |
| 消息中间件 | 服务间异步通信、消息队列 | NATS |
| MQTT服务器 | 设备通信协议支持 | EMQX |
1.3 技术栈
| 类别 | 技术选型 | 说明 |
|---|---|---|
| 后端框架 | go-zero | 高性能微服务框架 |
| 数据库 | MySQL/PostgreSQL | 关系型数据存储 |
| 时序数据库 | TDengine | 高性能时序数据处理 |
| 缓存 | Redis | 内存数据结构存储 |
| MQTT服务器 | EMQX | 分布式消息服务器 |
| 消息队列 | NATS | 高性能消息系统 |
| 对象存储 | MinIO | 云原生对象存储 |
| 服务注册 | etcd | 微服务模式支持 |
2. 设备-云-客户端流程
2.1 设备连接流程
- 设备连接请求:设备通过MQTT协议连接到EMQX服务器,携带设备ID、用户名和密码等认证信息
- EMQX Webhook触发:EMQX服务器配置了webhook,将认证请求转发到apisvr
- Apisvr认证处理:apisvr接收认证请求,进行多级认证:
- 超级用户检查:首先检查是否为系统超级用户
- 默认协议网关认证:尝试使用默认的dgsvr进行认证
- 第三方协议网关并发认证:如果默认网关认证失败,并发请求所有配置的第三方协议网关进行认证
- 认证结果返回:只要有一个协议网关返回认证成功,apisvr就向EMQX返回允许连接的响应
- 会话建立:EMQX与设备建立长连接会话
- 上线通知:dgsvr向dmsvr发送设备上线通知
2.2 订阅/发布权限控制流程
- 设备订阅/发布请求:设备向EMQX发送订阅或发布消息的请求
- EMQX Webhook触发:EMQX服务器配置的webhook将权限控制请求转发到apisvr
- Apisvr权限检查:apisvr接收权限控制请求,进行多级检查:
- 缓存检查:首先检查请求是否在缓存中,避免重复检查
- 默认协议网关检查:尝试使用默认的dgsvr进行权限检查
- 第三方协议网关并发检查:如果默认网关检查失败,并发请求所有配置的第三方协议网关进行权限检查
- 权限检查结果返回:只要有一个协议网关返回权限允许,apisvr就向EMQX返回允许操作的响应
- 操作执行:EMQX执行设备的订阅或发布操作
2.2 数据上报流程
- 数据采集:设备采集传感器数据或状态信息
- 数据封装:按照协议格式封装数据,生成消息Token
- 数据发送:通过MQTT协议将数据发送到指定主题
- 消息路由:dgsvr接收消息,根据topic路由到相应处理模块
- 数据处理:dmsvr处理设备数据:
- 协议脚本执行:调用UpBeforeTrans执行设备/产品级脚本,进行消息预处理
- 格式转换:将设备数据转换为统一格式
- 数据校验:验证数据合法性和完整性
- 数据持久化:
- 状态数据存储到MySQL
- 时序数据存储到TDengine
- 客户端推送:通过WebSocket/HTTP通知客户端设备状态变更
- 后续处理:调用UpAfterTrans执行设备/产品级脚本,进行消息后处理
2.3 命令下发流程
- 客户端请求:客户端通过API网关发送设备控制命令
- 权限验证:apisvr验证用户权限和设备访问权限
- 命令路由:apisvr将命令转发到dmsvr
- 命令封装:dmsvr封装命令,生成唯一消息Token
- 命令处理:
- 协议脚本执行:调用DownBeforeTrans执行设备/产品级脚本,进行命令预处理
- 格式转换:将命令转换为设备可识别的格式
- 命令下发:dgsvr通过MQTT将命令发送到设备
- 命令执行:设备执行命令并返回执行结果
- 结果处理:
- 命令结果处理:dmsvr处理设备返回的执行结果
- 协议脚本执行:调用DownAfterTrans执行设备/产品级脚本,进行命令后处理
- 结果反馈:结果通过原路径返回给客户端
2.4 设备管理流程
- 设备注册:管理员通过客户端注册新设备,生成设备ID和密钥
- 设备绑定:将设备绑定到特定用户或项目
- 设备配置:配置设备参数、上报频率、告警阈值等
- 固件升级:
- 上传新固件到平台
- 创建升级任务
- 设备接收升级通知并下载固件
- 执行升级并返回结果
- 设备监控:实时监控设备状态、连接情况和数据上报
3. 核心服务详解
3.1 设备网关服务 (dgsvr)
功能:
- 设备连接管理
- 设备认证和授权
- 消息路由和转发
- 设备在线状态监控
- 异常设备处理
实现细节:
- 基于MQTT协议处理设备通信
- 支持设备批量连接和高并发
- 实现设备心跳检测和重连机制
- 提供设备消息的可靠传输保障
3.2 设备管理服务 (dmsvr)
功能:
- 设备生命周期管理
- 设备数据处理和存储
- 设备命令下发和执行结果处理
- 固件升级管理
- 设备分组和权限管理
- 动态协议脚本执行
实现细节:
- 注册多个gRPC服务处理不同功能
- 支持设备物模型定义和数据解析
- 实现设备数据的批量处理和聚合
- 提供设备告警规则配置和触发
3.2.1 协议脚本机制
概述: 设备管理服务实现了动态协议脚本机制,允许在设备消息处理的各个阶段执行自定义脚本,实现消息的灵活转换和处理。脚本基于Go语言语法,使用yaegi解释器执行。
核心组件:
- ScriptTrans:脚本转换核心结构体,管理脚本缓存和执行环境
- ScriptInfo:脚本元数据,包含名称、优先级、内容等信息
- 脚本缓存:按产品和设备级别缓存不同类型的脚本
脚本执行点:
- UpBeforeTrans:设备消息上传前处理
- UpAfterTrans:设备消息上传后处理
- DownBeforeTrans:命令下发前处理
- DownAfterTrans:命令下发后处理
执行流程:
主要特性:
- 多级脚本支持:同时支持产品级和设备级脚本
- 优先级控制:脚本按优先级顺序执行
- 线程安全:使用读写锁保证并发安全
- 内置函数库:提供gjson、json、utils等常用函数
- 日志记录:脚本执行过程可记录详细日志
- 定期刷新:脚本每10分钟自动刷新,确保配置更新
- 租户隔离:支持多租户环境下的脚本隔离
脚本示例:
// 设备消息转换脚本示例
func Handle(ctx context.Context, msg *deviceMsg.PublishMsg) *deviceMsg.PublishMsg {
// 使用gjson解析消息内容
temperature := gjson.Get(string(msg.Payload), "temperature").Float()
humidity := gjson.Get(string(msg.Payload), "humidity").Float()
// 进行数据转换
adjustedTemp := temperature + 2.0
adjustedHumidity := humidity * 0.95
// 使用sjson更新消息内容
newPayload, _ := sjson.Set(string(msg.Payload), "temperature", adjustedTemp)
newPayload, _ = sjson.Set(newPayload, "humidity", adjustedHumidity)
msg.Payload = []byte(newPayload)
return msg
}3.3 API网关服务 (apisvr)
功能:
- 客户端接口服务
- 用户认证和权限控制
- 接口请求路由和转发
- 接口调用监控和统计
实现细节:
- 基于RESTful API设计
- 支持WebSocket实时通信
- 实现细粒度的权限控制
- 提供接口文档和SDK支持
4. 数据流转
4.1 数据在各服务间的流转
设备到云端:设备 → MQTT → dgsvr → NATS → dmsvr →
- 协议脚本执行:UpBeforeTrans(消息预处理)→
- 数据处理:格式转换、数据校验 →
- 数据持久化:数据库
- 后续处理:UpAfterTrans(消息后处理)
云端到设备:客户端 → apisvr → dmsvr →
- 协议脚本执行:DownBeforeTrans(命令预处理)→
- NATS → dgsvr → MQTT → 设备 →
- 命令执行:设备执行命令 →
- 结果返回:MQTT → dgsvr → NATS → dmsvr →
- 协议脚本执行:DownAfterTrans(命令后处理)→
- apisvr → 客户端
服务间通信:使用NATS实现异步消息通信,提高系统解耦和可扩展性
4.2 数据存储设计
| 数据类型 | 存储方式 | 说明 |
|---|---|---|
| 设备信息 | MySQL | 设备基本信息、配置参数 |
| 用户信息 | MySQL | 用户账号、权限、设备绑定关系 |
| 设备状态 | MySQL | 设备当前状态、在线状态 |
| 时序数据 | TDengine | 传感器数据、历史轨迹、性能指标 |
| 日志数据 | MySQL/文件 | 操作日志、设备日志、系统日志 |
| 固件文件 | MinIO | 设备固件、升级包 |
5. 扩展与部署
5.1 扩展能力
- 服务扩展:各服务可独立扩展,支持水平扩容
- 协议扩展:支持自定义协议插件,方便接入不同类型设备
- 功能扩展:支持模块化开发,可按需添加新功能
5.2 部署模式
5.2.1 单体部署
- 所有服务打包为一个可执行文件
- 适合小规模应用、开发测试环境
- 部署简单,资源占用小
5.2.2 微服务部署
- 各服务独立部署、独立扩展
- 适合大规模应用、生产环境
- 提高系统可用性和可扩展性
5.2.3 集群部署
- 服务节点集群化,实现高可用
- 数据存储采用主从复制或集群模式
- 负载均衡,提高系统性能和可靠性
6. 安全设计
6.1 通信安全
- MQTT协议支持TLS加密
- 数据传输采用AES-CTR加密算法
- 消息完整性验证和防篡改
6.2 认证与授权
- 设备认证采用设备ID+密钥方式
- 用户认证支持多种方式(账号密码、OAuth等)
- 细粒度的权限控制,基于角色和资源
6.3 数据安全
- 敏感数据加密存储
- 数据访问审计和日志记录
- 定期数据备份和恢复机制
7. 监控与运维
7.1 系统监控
- 服务运行状态监控
- 设备连接状态监控
- 消息队列监控
- 数据库性能监控
7.2 日志管理
- 服务日志集中管理
- 设备日志收集和分析
- 操作日志审计
7.3 故障处理
- 自动故障检测和报警
- 服务自动恢复机制
- 设备异常处理策略
8. 总结
联犀物联网平台采用先进的分层架构设计,实现了设备、云端服务和客户端的高效协同。平台具有良好的扩展性、可靠性和安全性,支持多种部署模式,可适应不同规模的物联网应用场景。核心服务之间通过消息中间件实现解耦,提高了系统的灵活性和可维护性。设备-云-客户端的流程设计确保了数据的可靠传输和处理,为物联网应用提供了坚实的技术基础。
更新日志
2025/12/28 18:01
查看所有更新日志
bddea-docs: 更新文档结构、添加新内容并优化现有文档于
