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。