物联网智能家居中使用WebSocket和Spring Boot实现全双工客服通信 -DZone Java


在本文中,我们将介绍创建由Spring Boot驱动的Java WebSocket服务器的步骤,该服务器与Java客户端通信并支持多个实例之间的负载平衡。我们将首先描述用例场景,分析需求,然后继续选择适合该情况的技术堆栈。我们将实现代码,最后测试应用程序以获得一些性能和持久性基准。

用例:智能家居
在我们的方案中,所有智能设备都具有与服务器的持久连接。服务器负责将命令发送到特定设备,例如打开客厅灯或启用警报。它还可以从设备接收信息。例如,可能有一个温度传感器每分钟读取一次读数,或者有一个烤箱在温度过高时发出警报。最后,服务器还可以向所有设备发出命令,例如打开/关闭。该服务器还公开了REST API,供用户用来收集信息和控制设备。

从现在开始,我们将智能设备称为客户端。因此,让我们写下需求:

  • 使用凭据登录客户端:我们假设每个客户端都有一对用于对服务器进行身份验证的凭据(用户名和密码)。 
  • 与服务器的持久连接:客户端与服务器保持双向持久连接。
  • 点对点通信:服务器必须能够向特定客户端发送(和接收)消息。
  • 广播消息:服务器必须能够向所有客户端广播消息。
  • 断开的连接检测和恢复:客户端应该能够检测到断开的连接并尝试自动重新连接。
  • 服务器可伸缩性:如果网络流量过高,则必须轻松扩展服务器应用程序实例的数量。

技术栈
现在已经建立了需求,我们将描述用于实现解决方案的技术堆栈。对于服务器,我们将使用微服务模式。每个微服务(MS)都是使用Spring Boot框架(尤其是Web on Servlet堆栈)以Java 11编写的。与客户端的通信由设备管理MS处理。Control MS公开REST API,并使用ActiveMQ Artemis消息代理与Device Mgmt MS通信。对于传入的流量路由,服务发现和负载平衡,我们将使用Spring Cloud Gateway和Eureka。


如前所述,服务器和客户端通过WebSocket进行通信。该协议允许持久的全双工通信,以及服务器和客户端都检测到断开的连接。
因为WebSocket是一个低级协议,没有指定传输消息的结构,所以我们还需要实现一个更高级别的协议,这将是发送方和接收方之间的“契约”。为此,我们将使用STOMP(面向简单文本的消息协议)。我们还将配置Spring与专门的STOMP代理一起工作,以实际广播消息。一种简单的方法是使用一个简单的内存代理。但是,当您扩展并添加其他服务器时,这种方法不足。连接到不同服务器的用户将无法交流或获取更新到另一台服务器上发生的事情。因此,我们将使用外部代理(ActiveMQ Artemis)。有关更多详细信息,请参见此处:Spring框架参考-外部代理

代码详情点击标题见原文