物聯網智慧家居中使用WebSocket和Spring Boot實現全雙工客服通訊 -DZone Java

banq發表於2020-05-07

在本文中,我們將介紹建立由Spring Boot驅動的Java WebSocket伺服器的步驟,該伺服器與Java客戶端通訊並支援多個例項之間的負載平衡。我們將首先描述用例場景,分析需求,然後繼續選擇適合該情況的技術堆疊。我們將實現程式碼,最後測試應用程式以獲得一些效能和永續性基準。

用例:智慧家居

在我們的方案中,所有智慧裝置都具有與伺服器的持久連線。伺服器負責將命令傳送到特定裝置,例如開啟客廳燈或啟用警報。它還可以從裝置接收資訊。例如,可能有一個溫度感測器每分鐘讀取一次讀數,或者有一個烤箱在溫度過高時發出警報。最後,伺服器還可以向所有裝置發出命令,例如開啟/關閉。該伺服器還公開了REST API,供使用者用來收集資訊和控制裝置。

物聯網智慧家居中使用WebSocket和Spring Boot實現全雙工客服通訊 -DZone Java

從現在開始,我們將智慧裝置稱為客戶端。因此,讓我們寫下需求:

  • 使用憑據登入客戶端:我們假設每個客戶端都有一對用於對伺服器進行身份驗證的憑據(使用者名稱和密碼)。 
  • 與伺服器的持久連線:客戶端與伺服器保持雙向持久連線。
  • 點對點通訊:伺服器必須能夠向特定客戶端傳送(和接收)訊息。
  • 廣播訊息:伺服器必須能夠向所有客戶端廣播訊息。
  • 斷開的連線檢測和恢復:客戶端應該能夠檢測到斷開的連線並嘗試自動重新連線。
  • 伺服器可伸縮性:如果網路流量過高,則必須輕鬆擴充套件伺服器應用程式例項的數量。

技術棧

現在已經建立了需求,我們將描述用於實現解決方案的技術堆疊。對於伺服器,我們將使用微服務模式。每個微服務(MS)都是使用Spring Boot框架(尤其是Web on Servlet堆疊)以Java 11編寫的。與客戶端的通訊由裝置管理MS處理。Control MS公開REST API,並使用ActiveMQ Artemis訊息代理與Device Mgmt MS通訊。對於傳入的流量路由,服務發現和負載平衡,我們將使用Spring Cloud Gateway和Eureka。

物聯網智慧家居中使用WebSocket和Spring Boot實現全雙工客服通訊 -DZone Java

如前所述,伺服器和客戶端通過WebSocket進行通訊。該協議允許持久的全雙工通訊,以及伺服器和客戶端都檢測到斷開的連線。

因為WebSocket是一個低階協議,沒有指定傳輸訊息的結構,所以我們還需要實現一個更高階別的協議,這將是傳送方和接收方之間的“契約”。為此,我們將使用STOMP(面向簡單文字的訊息協議)。我們還將配置Spring與專門的STOMP代理一起工作,以實際廣播訊息。一種簡單的方法是使用一個簡單的記憶體代理。但是,當您擴充套件並新增其他伺服器時,這種方法不足。連線到不同伺服器的使用者將無法交流或獲取更新到另一臺伺服器上發生的事情。因此,我們將使用外部代理(ActiveMQ Artemis)。有關更多詳細資訊,請參見此處:Spring框架參考-外部代理

程式碼詳情點選標題見原文

 

相關文章