1. 工程代码及结构分析
文档更新日期:2023-02-20 11:21:00
ThingsBoard 是什么
ThingsBoard 是一个备受瞩目的开源物联网平台,其优秀的性能和高效的性能得到了广大开发者的认可。ThingsBoard 用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议 - MQTT、CoAP 和 HTTP 实现设备连接,并支持云和本地部署。Thingsboard 具有可伸缩性、容错性和性能优越的特点。
功能列举:
- 设备管理,资产和客户并定义他们之间的关系。
- 基于设备和资产收集数据并进行可视化。
- 采集遥测数据并进行相关的事件处理进行警报响应。
- 基于远程 RPC 调用进行设备控制。
- 基于生命周期事件、REST API 事件、RPC 请求构建工作流。
- 基于动态设计和响应仪表板向你的客户提供设备或资产的遥测数据。
- 基于规则链自定义特定功能。
- 发布设备数据至第三方系统。
了解更多功能请参见 ThingsBoard 功能列表 。
ThingsBoard 功能
功能模块结构划分
模块 | 目录 | 消费方 | 简要说明 | 功能职责 | 是否可修改 |
ThingsBoard Server Application | aplication | Core | 应用相关 | 同时也是启动类。包含 thingsboard 提供的 rest 接口,后端主要修改的模块 | 可修改 |
Thingsboard Server Commons | common | Core, Rule-engine | 公共部分 | thingsboard 公共接口 interface 定义,包含基础方法。包含了data、util、message 、actor、queue、 transport 、dao-api、cluster-api、stats、cache 、coap-serve、edge-api 共计 12 个 sub module | 不可修改 |
Thingsboard Server DAO Layer | dao | Core, Rule-engine | dao 层 | 数据访问层 | 可修改 |
Netty MQTT Client | netty-mqtt | Rule-engine | Netty MQTT 客户端的实现 | 提供给规则引擎使用。目前为构建 MqttNode 提供支持,该节点用于发送消息到 MQTT broker | 无需修改 |
Netty MQTT Client | netty-mqtt | Rule-engine | Netty MQTT 客户端的实现 | 提供给规则引擎使用。目前为构建 MqttNode 提供支持,该节点用于发送消息到 MQTT broker。 | 无需修改 |
Thingsboard Rest Client | rest-client | 不适用 | 提供 java 版客户端 | 提供 java 版客户端,简化对 rest 接口的调用。 | 可修改 |
Thingsboard Extensions | rule-engine | Rule-engine | 规则引擎 | 分为 api module 和 components module 两大块。 | 不可修改 |
Thingsboard Server Transport Modules | transport | Transports | 提供给设备使用的 api | ThingsBoard 提供基于 MQTT、 HTTP、 CoAP 和 LwM2M 的 api,可用于设备应用程序/固件。每个协议 api 都由一个单独的服务器组件提供,并且是 ThingsBoard “传输层” 的一部分。MQTT Transport 还提供了网关 api,供代表多个连接设备和/或传感器的网关使用。 | 不可修改 |
ThingsBoard Server UI | ui-ngx | ui | 前端页面 | ThingsBoard 提供了一个使用 Express.js 框架编写的轻量级组件来承载静态 web ui 内容。使用了 Angularjs、ES6、Reactjs、webpack、node 技术 | 可修改 |
其他目录结构划分
目录 | 消费方 | 简要说明 | 功能职责 | 是否可修改 |
docker | 不适用 | docker 部署文件夹 | 包含大量 docker 打包和虚拟部署的脚本和配置模板 | 无需修改 |
img | 不适用 | 图片文件夹 | 仅用于存放 Logo.png 图片 | 可修改 |
msa | 不适用 | 提供微服务支持 | 提供微服务支持 | 不可修改 |
packaging | 不适用 | 打包应用专用目录 | 打包应用专用目录 | 不可修改 |
tools | 不适用 | 工具类 | 系统工具类。提供了用于将 ThingsBoard 从 Postgres 迁移到 hybrid 模式。MQTT SSL 用于测试的客户端。基于 python 环境的 mqtt 测试工具类。 | 可修改 |
说明:aplication,rule-engine 和 transport 是需要重点关注的内容。已着重加粗表示。
编程语言和第三方
ThingsBoard 后端是用 Java 编写的但是我们也有一些基于 Node.js 的微服务。
ThingsBoard 前端是基于 Angular JS 框架的 SPA。
架构说明
ThingsBoard 设计原则:
- 高扩展: 使用领先开源技术构建的可水平扩展平台。
- 高容错:无单点故障集群中的每个节点都是相同的。
- 高性能:单个服务器节点可以根据用例处理几十甚至数十万个设备,集群可以处理数百万台设备。
- 高灵活:开发新功能可以方便的使用自定义部件、规则引擎等。
- 持久化:数据永久保存
重要概念:
设备接入:MQTT、CoAP、HTTP
规则引擎:配置设备消息的处理流程
核心服务:设备认证、规则和插件、租户和客户、小组件和仪表盘、告警和事件
服务端 API 网关:REST API、websockets
Actor 模型:主要用于并发
集群模式:Zookeeper 用于服务发现,一致性哈希保证消息的扩展性和可用性。
安全:SSL用于 HTTP 和 MQTT
设备认证:Token 和 X.509
第三方工具:AKKA【Actor】、Zookeeper、gRPC、Cassandra
单体技术架构说明
目前一共包含 Transports,UI,core 和 Rule-Engine 四部分内容。
1. Core 服务
ThingsBoard Core 负责处理 REST API 调用和 WebSocket 订阅。它还负责存储有关活动设备会话和监视设备连接状态的最新信息。ThingsBoard 核心使用角色系统实现主要实体的角色: 租户和设备。平台节点可以加入集群,其中每个节点负责传入消息的某些分区。
包接口展示:
- appaction.main.java.org.thingsboard.server ThingsboardServerApplication.java(启动类)
- install 服务开启相关配置、异常和调用
- exception 响应错误及错误逻辑处理
- controller 页面展示必要的系统数据接口
- service 为 controller 提供支持
- config 为同源策略、swagger、webSocket、消息及安全配置注册 spring bean
2. Transports components
ThingsBoard 提供基于 MQTT、 HTTP、 CoAP 和 LwM2M 的 api,可用于设备应用程序/固件。每个协议 api 都由一个单独的服务器组件提供,并且是 ThingsBoard “传输层”的一部分。MQTT 传输还提供了网关 api,供代表多个连接设备和/或传感器的网关使用。
一旦传输从设备接收到消息,它将被解析并推送到持久消息队列。只有在消息队列确认了相应的消息之后,消息传递才会被设备确认。
3. Rule-Engine component
ThingsBoard 规则引擎是系统的核心,负责用用户定义的逻辑和流程处理传入的消息。使用了 Actor System 来实现主要实体的参与者: 规则链和规则节点。规则引擎节点可以加入集群,其中每个节点负责传入消息的某些分区。
Rule Engine 订阅来自队列的传入数据提要,并且只在处理消息后才确认该消息。有多种策略可用于控制订单或消息处理以及消息确认标准。详情请参阅提交策略和处理策略。
规则引擎可以在两种模式下运行: 共享和隔离。在共享模式下,规则引擎处理属于多个承租者的消息。在隔离模式下,规则引擎可能被配置为仅处理特定承租者的消息。
4. Web UI 服务
ThingsBoard 提供了一个使用 Express.js 框架编写的轻量级组件来承载静态 web ui 内容。这些组件是完全无状态的,没有多少可用的配置。静态网页界面包含捆绑。一旦加载完成,应用程序就开始使用 ThingsBoard Core 提供的 REST API 和 websocket API。
微服务架构说明
自 ThingsBoard v2.2 以来,该平台支持微服务部署模式。这里会说明包括高级图、各种服务之间的数据流描述以及所做的一些架构选择。
thingsboard 微服务构架详情:https://thingsboard.io/docs/reference/msa/
1. Transport 微服务
ThingsBoard 提供基于 MQTT、 HTTP 和 CoAP 的 api,可用于设备应用程序/固件。每个协议 api 都由一个单独的服务器组件提供,并且是 ThingsBoard 传输层的一部分。
2. Node 微服务
节点是一个用 Java 编写的核心服务,负责处理:
- REST API 调用;
- 关于实体遥测和属性更改的 WebSocket 订阅;
- 通过规则引擎处理消息;
- 监视设备连接状态(活动/非活动)。
注意: ThingsBoard v2.5 调度将规则引擎移动到单独的微服务。
ThingsBoard 节点使用 Actor System 来实现租户、设备、规则链和规则节点参与者。平台节点可以加入集群,其中每个节点相等。服务发现是通过 Zookeeper 完成的。节点使用基于实体 id 的一致哈希算法在彼此之间路由消息。因此,同一实体的消息在同一 ThingsBoard 节点上处理。平台使用 gRPC 在 ThingsBoard 节点之间发送消息。
注意: ThingsBoard 的作者们考虑在未来的版本中从 gRPC 迁移到 Kafka,以便在 ThingsBoard 节点之间交换消息。其主要思想是牺牲小的性能/延迟代价,以换取 Kafka 用户组提供的持久可靠的消息传递和自动负载平衡。
3. Web UI 微服务
提供了一个使用 Express.js 框架编写的轻量级组件来承载静态 web ui 内容。这些组件是完全无状态的,没有多少可用的配置。
4. JavaScript Executor 微服务
ThingsBoard 规则引擎允许用户指定自定义的 JavaScript 函数来解析、过滤和转换消息。由于这些函数是用户定义的,因此我们需要在独立的上下文中执行它们,以避免影响主处理。提供了一个使用 Node.js 编写的轻量级组件,远程执行用户定义的 JavaScript 函数,将它们与核心规则引擎组件隔离开来。
依赖中间件说明
单体架构依赖中间件说明
消息队列
ThingsBoard 支持多种消息队列实现: Kafka、 RabbitMQ、 AWS SQS、 Azure 服务总线和 Google Pub/Sub。未来 thingsborad 还会将名单进行扩充。
数据库
ThingsBoard 使用数据库存储实体(设备、资产、客户、仪表板等)和遥测数据(属性、时间/传感器读数、统计数据、事件)。平台目前支持三种数据库选项:
- NoSQL (不推荐)-存储所有实体和遥测数据在 NoSQL 数据库。ThingsBoard 的作者建议使用 Cassandra,这是目前唯一一个 ThingsBoard 支持的 NoSQL 数据库。
- 混合(PostgreSQL + Cassandra)-在 PostgreSQL 数据库中存储所有实体,在 Cassandra 数据库中存储时间序列数据。
- 混合(PostgreSQL + Timescale)-在 PostgreSQL 数据库中存储所有实体,在 Timescale 数据库中存储时间序列数据。
Redis
Redis 用于缓存资产、实体视图、设备、设备凭证、设备会话和实体关系。
微服务架构依赖中间件说明
在单体架构需要的中间件的基础上,还要有以下补充。
kafka
ThingsBoard 使用 Kafka 持久保存从 HTTP / MQTT / CoAP 传输站传入的遥测数据,直到它被规则引擎处理为止。ThingsBoard 还在微服务之间使用 Kafka 进行一些 API 调用。
Zookeeper
Zookeeper 可实现高度可靠的分布式协调。使用 Zookeeper 来处理从单个实体(设备、资产、租户)到特定 ThingsBoard 服务器的请求处理,并确保只有一个服务器在单个时间点处理来自特定设备的数据。Zookeeper 使用一致性哈希算法确定每个使用者应订阅的分区列表。如单体架构中使用了 kafka 则会成为必选组件。
LoadBalancer 组件
在微服务架构中,官方建议使用 HAProxy,您也可以用一些其他 LoadBalancer。