ThingsBoard 物联网平台-代码结构分析

2022-05-25 11:06:51 浏览数 (1)

什么是 ThingsBoard

简介

ThingsBoard 是一个备受瞩目的开源物联网平台,其优秀的性能和高效的性能得到了广大开发者的认可。ThingsBoard 是用于数据收集、处理、可视化和设备管理的开源物联网平台。它通过行业标准的物联网协议 - MQTT、CoAP 和 HTTP 实现设备连接,并支持云和本地部署。Thingsboard 具有可伸缩性、容错性和性能优越的特点。

功能

  • 设备管理,资产和客户并定义他们之间的关系。
  • 基于设备和资产收集数据并进行可视化。
  • 采集遥测数据并进行相关的事件处理进行警报响应。
  • 基于远程 RPC 调用进行设备控制。
  • 基于生命周期事件、REST API 事件、RPC 请求构建工作流。
  • 基于动态设计和响应仪表板向你的客户提供设备或资产的遥测数据。
  • 基于规则链自定义特定功能。
  • 发布设备数据至第三方系统。

了解更多功能请参见 ThingsBoard 功能列表

单体技术架构说明

1. Core 服务

ThingsBoard Core 负责处理 REST API 调用和 WebSocket 订阅。它还负责存储有关活动设备会话和监视设备连接状态的最新信息。ThingsBoard 核心使用角色系统实现主要实体的角色: 租户和设备。平台节点可以加入集群,其中每个节点负责传入消息的某些分区。

包接口展示:

  • appaction.main.java.org.thingsboard.server ThingsboardServerApplication.java(启动类)
  • install thingsboard 服务开启相关配置、异常和调用
  • exception thingsboard 响应错误及错误逻辑处理
  • controller thingsboard 页面展示必要的 系统数据 接口
  • 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 以来,该平台支持微服务部署模式。这里会说明包括高级图、各种服务之间的数据流描述以及所做的一些架构选择。

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 模块划分

模块划分见下表:

模块

目录

消费方

简要说明

功能职责

是否可修改

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 支持多种消息队列实现: 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 服务器的请求处理,并确保只有一个服务器在单个时间点处理来自特定设备的数据。zk 使用一致性哈希算法确定每个使用者应订阅的分区列表。如单体架构中使用了 kafka 则会成为必选组件。

LoadBalancer

在微服务架构中,建议使用 HAProxy 或其他 LoadBalancer

0 人点赞