ThingsBoard 物聯(lián)網(wǎng)平臺-代碼結(jié)構(gòu)分析

1. 工程代碼及結(jié)構(gòu)分析

文檔更新日期:2023-02-20 11:21:00

ThingsBoard 是什么

ThingsBoard 是一個備受矚目的開源物聯(lián)網(wǎng)平臺,其優(yōu)秀的性能和高效的性能得到了廣大開發(fā)者的認可。ThingsBoard 用于數(shù)據(jù)收集、處理、可視化和設(shè)備管理的開源物聯(lián)網(wǎng)平臺。它通過行業(yè)標準的物聯(lián)網(wǎng)協(xié)議 - MQTT、CoAP 和 HTTP 實現(xiàn)設(shè)備連接,并支持云和本地部署。Thingsboard 具有可伸縮性、容錯性和性能優(yōu)越的特點。

功能列舉:

  • 設(shè)備管理,資產(chǎn)和客戶并定義他們之間的關(guān)系。
  • 基于設(shè)備和資產(chǎn)收集數(shù)據(jù)并進行可視化。
  • 采集遙測數(shù)據(jù)并進行相關(guān)的事件處理進行警報響應(yīng)。
  • 基于遠程 RPC 調(diào)用進行設(shè)備控制。
  • 基于生命周期事件、REST API 事件、RPC 請求構(gòu)建工作流。
  • 基于動態(tài)設(shè)計和響應(yīng)儀表板向你的客戶提供設(shè)備或資產(chǎn)的遙測數(shù)據(jù)。
  • 基于規(guī)則鏈自定義特定功能。
  • 發(fā)布設(shè)備數(shù)據(jù)至第三方系統(tǒng)。

了解更多功能請參見 ThingsBoard 功能列表 。

ThingsBoard 功能

功能模塊結(jié)構(gòu)劃分

模塊 目錄 消費方 簡要說明 功能職責 是否可修改
ThingsBoard Server Application aplication Core 應(yīng)用相關(guān) 同時也是啟動類。包含 thingsboard 提供的 rest 接口,后端主要修改的模塊 可修改
Thingsboard Server Commons common Core, Rule-engine 公共部分 thingsboard 公共接口 interface 定義,包含基礎(chǔ)方法。包含了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 層 數(shù)據(jù)訪問層 可修改
Netty MQTT Client netty-mqtt Rule-engine Netty MQTT 客戶端的實現(xiàn) 提供給規(guī)則引擎使用。目前為構(gòu)建 MqttNode 提供支持,該節(jié)點用于發(fā)送消息到 MQTT broker 無需修改
Netty MQTT Client netty-mqtt Rule-engine Netty MQTT 客戶端的實現(xiàn) 提供給規(guī)則引擎使用。目前為構(gòu)建 MqttNode 提供支持,該節(jié)點用于發(fā)送消息到 MQTT broker。 無需修改
Thingsboard Rest Client rest-client 不適用 提供 java 版客戶端 提供 java 版客戶端,簡化對 rest 接口的調(diào)用。 可修改
Thingsboard Extensions rule-engine Rule-engine 規(guī)則引擎 分為 api module 和 components module 兩大塊。 不可修改
Thingsboard Server Transport Modules transport Transports 提供給設(shè)備使用的 api ThingsBoard 提供基于 MQTT、 HTTP、 CoAP 和 LwM2M 的 api,可用于設(shè)備應(yīng)用程序/固件。每個協(xié)議 api 都由一個單獨的服務(wù)器組件提供,并且是 ThingsBoard “傳輸層” 的一部分。MQTT Transport 還提供了網(wǎng)關(guān) api,供代表多個連接設(shè)備和/或傳感器的網(wǎng)關(guān)使用。 不可修改
ThingsBoard Server UI ui-ngx ui 前端頁面 ThingsBoard 提供了一個使用 Express.js 框架編寫的輕量級組件來承載靜態(tài) web ui 內(nèi)容。使用了 Angularjs、ES6、Reactjs、webpack、node 技術(shù) 可修改

其他目錄結(jié)構(gòu)劃分

目錄 消費方 簡要說明 功能職責 是否可修改
docker 不適用 docker 部署文件夾 包含大量 docker 打包和虛擬部署的腳本和配置模板 無需修改
img 不適用 圖片文件夾 僅用于存放 Logo.png 圖片 可修改
msa 不適用 提供微服務(wù)支持 提供微服務(wù)支持 不可修改
packaging 不適用 打包應(yīng)用專用目錄 打包應(yīng)用專用目錄 不可修改
tools 不適用 工具類 系統(tǒng)工具類。提供了用于將 ThingsBoard 從 Postgres 遷移到 hybrid 模式。MQTT SSL 用于測試的客戶端?;?python 環(huán)境的 mqtt 測試工具類。 可修改

說明:aplication,rule-engine 和 transport 是需要重點關(guān)注的內(nèi)容。已著重加粗表示。

編程語言和第三方
ThingsBoard 后端是用 Java 編寫的但是我們也有一些基于 Node.js 的微服務(wù)。
ThingsBoard 前端是基于 Angular JS 框架的 SPA。
有關(guān)使用的第三方組件的更多詳細信息請參見整體微服務(wù)頁面。

協(xié)議 Apache 2.0 License

架構(gòu)說明

ThingsBoard 設(shè)計原則:

  • 高擴展: 使用領(lǐng)先開源技術(shù)構(gòu)建的可水平擴展平臺。
  • 高容錯:無單點故障集群中的每個節(jié)點都是相同的。
  • 高性能:單個服務(wù)器節(jié)點可以根據(jù)用例處理幾十甚至數(shù)十萬個設(shè)備,集群可以處理數(shù)百萬臺設(shè)備。
  • 高靈活:開發(fā)新功能可以方便的使用自定義部件、規(guī)則引擎等。
  • 持久化:數(shù)據(jù)永久保存

重要概念:

設(shè)備接入:MQTT、CoAP、HTTP
規(guī)則引擎:配置設(shè)備消息的處理流程
核心服務(wù):設(shè)備認證、規(guī)則和插件、租戶和客戶、小組件和儀表盤、告警和事件
服務(wù)端 API 網(wǎng)關(guān):REST API、websockets
Actor 模型:主要用于并發(fā)
集群模式:Zookeeper 用于服務(wù)發(fā)現(xiàn),一致性哈希保證消息的擴展性和可用性。
安全:SSL用于 HTTP 和 MQTT
設(shè)備認證:Token 和 X.509
第三方工具:AKKA【Actor】、Zookeeper、gRPC、Cassandra

單體技術(shù)架構(gòu)說明

目前一共包含 Transports,UI,core 和 Rule-Engine 四部分內(nèi)容。

1. Core 服務(wù)

ThingsBoard Core 負責處理 REST API 調(diào)用和 WebSocket 訂閱。它還負責存儲有關(guān)活動設(shè)備會話和監(jiān)視設(shè)備連接狀態(tài)的最新信息。ThingsBoard 核心使用角色系統(tǒng)實現(xiàn)主要實體的角色: 租戶和設(shè)備。平臺節(jié)點可以加入集群,其中每個節(jié)點負責傳入消息的某些分區(qū)。

包接口展示:

  • appaction.main.java.org.thingsboard.server ThingsboardServerApplication.java(啟動類)
  • install 服務(wù)開啟相關(guān)配置、異常和調(diào)用
  • exception 響應(yīng)錯誤及錯誤邏輯處理
  • controller 頁面展示必要的系統(tǒng)數(shù)據(jù)接口
  • service 為 controller 提供支持
  • config 為同源策略、swagger、webSocket、消息及安全配置注冊 spring bean

2. Transports components

ThingsBoard 提供基于 MQTT、 HTTP、 CoAP 和 LwM2M 的 api,可用于設(shè)備應(yīng)用程序/固件。每個協(xié)議 api 都由一個單獨的服務(wù)器組件提供,并且是 ThingsBoard “傳輸層”的一部分。MQTT 傳輸還提供了網(wǎng)關(guān) api,供代表多個連接設(shè)備和/或傳感器的網(wǎng)關(guān)使用。

一旦傳輸從設(shè)備接收到消息,它將被解析并推送到持久消息隊列。只有在消息隊列確認了相應(yīng)的消息之后,消息傳遞才會被設(shè)備確認。

3. Rule-Engine component

ThingsBoard 規(guī)則引擎是系統(tǒng)的核心,負責用用戶定義的邏輯和流程處理傳入的消息。使用了 Actor System 來實現(xiàn)主要實體的參與者: 規(guī)則鏈和規(guī)則節(jié)點。規(guī)則引擎節(jié)點可以加入集群,其中每個節(jié)點負責傳入消息的某些分區(qū)。

Rule Engine 訂閱來自隊列的傳入數(shù)據(jù)提要,并且只在處理消息后才確認該消息。有多種策略可用于控制訂單或消息處理以及消息確認標準。詳情請參閱提交策略和處理策略。

規(guī)則引擎可以在兩種模式下運行: 共享和隔離。在共享模式下,規(guī)則引擎處理屬于多個承租者的消息。在隔離模式下,規(guī)則引擎可能被配置為僅處理特定承租者的消息。

4. Web UI 服務(wù)

ThingsBoard 提供了一個使用 Express.js 框架編寫的輕量級組件來承載靜態(tài) web ui 內(nèi)容。這些組件是完全無狀態(tài)的,沒有多少可用的配置。靜態(tài)網(wǎng)頁界面包含捆綁。一旦加載完成,應(yīng)用程序就開始使用 ThingsBoard Core 提供的 REST API 和 websocket API。

微服務(wù)架構(gòu)說明

自 ThingsBoard v2.2 以來,該平臺支持微服務(wù)部署模式。這里會說明包括高級圖、各種服務(wù)之間的數(shù)據(jù)流描述以及所做的一些架構(gòu)選擇。

thingsboard 微服務(wù)構(gòu)架詳情:https://thingsboard.io/docs/reference/msa/

1. Transport 微服務(wù)

ThingsBoard 提供基于 MQTT、 HTTP 和 CoAP 的 api,可用于設(shè)備應(yīng)用程序/固件。每個協(xié)議 api 都由一個單獨的服務(wù)器組件提供,并且是 ThingsBoard 傳輸層的一部分。

2. Node 微服務(wù)

節(jié)點是一個用 Java 編寫的核心服務(wù),負責處理:

  • REST API 調(diào)用;
  • 關(guān)于實體遙測和屬性更改的 WebSocket 訂閱;
  • 通過規(guī)則引擎處理消息;
  • 監(jiān)視設(shè)備連接狀態(tài)(活動/非活動)。

注意: ThingsBoard v2.5 調(diào)度將規(guī)則引擎移動到單獨的微服務(wù)。

ThingsBoard 節(jié)點使用 Actor System 來實現(xiàn)租戶、設(shè)備、規(guī)則鏈和規(guī)則節(jié)點參與者。平臺節(jié)點可以加入集群,其中每個節(jié)點相等。服務(wù)發(fā)現(xiàn)是通過 Zookeeper 完成的。節(jié)點使用基于實體 id 的一致哈希算法在彼此之間路由消息。因此,同一實體的消息在同一 ThingsBoard 節(jié)點上處理。平臺使用 gRPC 在 ThingsBoard 節(jié)點之間發(fā)送消息。

注意: ThingsBoard 的作者們考慮在未來的版本中從 gRPC 遷移到 Kafka,以便在 ThingsBoard 節(jié)點之間交換消息。其主要思想是犧牲小的性能/延遲代價,以換取 Kafka 用戶組提供的持久可靠的消息傳遞和自動負載平衡。

3. Web UI 微服務(wù)

提供了一個使用 Express.js 框架編寫的輕量級組件來承載靜態(tài) web ui 內(nèi)容。這些組件是完全無狀態(tài)的,沒有多少可用的配置。

4. JavaScript Executor 微服務(wù)

ThingsBoard 規(guī)則引擎允許用戶指定自定義的 JavaScript 函數(shù)來解析、過濾和轉(zhuǎn)換消息。由于這些函數(shù)是用戶定義的,因此我們需要在獨立的上下文中執(zhí)行它們,以避免影響主處理。提供了一個使用 Node.js 編寫的輕量級組件,遠程執(zhí)行用戶定義的 JavaScript 函數(shù),將它們與核心規(guī)則引擎組件隔離開來。

依賴中間件說明

單體架構(gòu)依賴中間件說明

消息隊列

ThingsBoard 支持多種消息隊列實現(xiàn): Kafka、 RabbitMQ、 AWS SQS、 Azure 服務(wù)總線和 Google Pub/Sub。未來 thingsborad 還會將名單進行擴充。

數(shù)據(jù)庫

ThingsBoard 使用數(shù)據(jù)庫存儲實體(設(shè)備、資產(chǎn)、客戶、儀表板等)和遙測數(shù)據(jù)(屬性、時間/傳感器讀數(shù)、統(tǒng)計數(shù)據(jù)、事件)。平臺目前支持三種數(shù)據(jù)庫選項:

  • NoSQL (不推薦)-存儲所有實體和遙測數(shù)據(jù)在 NoSQL 數(shù)據(jù)庫。ThingsBoard 的作者建議使用 Cassandra,這是目前唯一一個 ThingsBoard 支持的 NoSQL 數(shù)據(jù)庫。
  • 混合(PostgreSQL + Cassandra)-在 PostgreSQL 數(shù)據(jù)庫中存儲所有實體,在 Cassandra 數(shù)據(jù)庫中存儲時間序列數(shù)據(jù)。
  • 混合(PostgreSQL + Timescale)-在 PostgreSQL 數(shù)據(jù)庫中存儲所有實體,在 Timescale 數(shù)據(jù)庫中存儲時間序列數(shù)據(jù)。

Redis

Redis 用于緩存資產(chǎn)、實體視圖、設(shè)備、設(shè)備憑證、設(shè)備會話和實體關(guān)系。

微服務(wù)架構(gòu)依賴中間件說明

在單體架構(gòu)需要的中間件的基礎(chǔ)上,還要有以下補充。

kafka

ThingsBoard 使用 Kafka 持久保存從 HTTP / MQTT / CoAP 傳輸站傳入的遙測數(shù)據(jù),直到它被規(guī)則引擎處理為止。ThingsBoard 還在微服務(wù)之間使用 Kafka 進行一些 API 調(diào)用。

Zookeeper

Zookeeper 可實現(xiàn)高度可靠的分布式協(xié)調(diào)。使用 Zookeeper 來處理從單個實體(設(shè)備、資產(chǎn)、租戶)到特定 ThingsBoard 服務(wù)器的請求處理,并確保只有一個服務(wù)器在單個時間點處理來自特定設(shè)備的數(shù)據(jù)。Zookeeper 使用一致性哈希算法確定每個使用者應(yīng)訂閱的分區(qū)列表。如單體架構(gòu)中使用了 kafka 則會成為必選組件。

LoadBalancer 組件

在微服務(wù)架構(gòu)中,官方建議使用 HAProxy,您也可以用一些其他 LoadBalancer。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容