SpringBoot单机和分布式(RocketMQ解决)WebSocket聊天室

      最后更新:2022-08-03 16:54:53 手机定位技术交流文章

      提示:文章写完后,目录可以自动生成。如何生成右边的参考帮助文档

      SpringBoot单机和分布式WebSocket聊天室

      • github下载地址
      • 前言
        • WebSocke
      • 源码解读
        • 实现原理
        • 单机
        • POM依赖
        • 创建配置
        • 编译Websocket服务器
        • 单机如何测试
        • 分布式的问题
      • 需要改进的地方

      注意,两个用户可以在同一房间里互相聊天在这里插入图片描述

      在线体验地址: http://47.103.194.1:8081/

      github下载地址

      https://github.com/MaBo2420935619/Websocket
      在这里插入图片描述

      前言

      HTTP协议有一个缺点:通信只能由客户端发起。HTTP协议不允许服务器直接向客户端发送信息。

      这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。
      轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。因此,出现了 WebSocket。

      WebSocke

      WebSocket是一个单一的TCP连接上完全双重通信的协议,WebSocket使得客户和服务器之间更容易交换数据,允许服务器自行向客户发送数据。
      在WebSocket中,浏览器和服务器可以直接创建一个持久的连接,并以单一的手握住两个方向传输数据。
      因此,可以通过Websocket实现在线聊天室的功能

      源码解读

      实现原理

      当用户登录后,向房间1发送消息,服务器收到消息后,找到所有在房间1的用户,并且向这些用户转发这条消息。即可实现网络聊天室的功能。

      单机

      首先创建 SpringBoot项目

      POM依赖

      创建配置

      编译Websocket服务器

      单机如何测试

      这里可以启动网络接口服务器进行测试,
      但客户需要进行测试
      下载git前端文件
      https://github.com/MaBo2420935619/Websocket/tree/main/src/main/resources/static
      直接打开它进行测试
      在这里插入图片描述

      分布式的问题

      Websocket识别用户并且发送消息时根据用户的session来进行发送的,其他jvm中的websocket时无法获取的,所以需要依赖中间件来解决这个问题

      分布式下的websocket消息无法依靠websocket实现消息发送,
      该demo使用RocketMQ的广播消息模式,对所有服务器发送消息,如果当前服务器连接了该用户则该服务器对用户发送消息,通过这种方式可以实现分布式部署情况下实现网络聊天室

      消费者代码

      生产者代码

      配置文件

      需要改进的地方

      在一个单机中的所有用户信息都存储在静态修改的静态变量中,每个发送的消息要求所有服务器查询是否存在一个用户在变量服务器中,导致效率低下。

      您可以使用Redis缓存,用户登录在缓存中存储的服务器,并在每次发送时向缓存中的服务器发送消息(或添加服务器标签),这可以提高发送消息的效率。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/31434.html

          热门文章

          文章分类