springboot中优雅的使用websocket通信(分布式)

关于什么是websocket以及为什么要使用websocket我这里就不去描述了,可以看一下知乎上的这个回答
WebSocket是什么原理
好,我们直接进入主题:在Springboot中优雅的使用websocket通信

一、理解需求

例如我们现在有一个需求:站内消息自动刷新
1、消息是谁来发送?
在我们的系统里面,每一个用户的某一些操作都会给对应的处理人发送消息。
2、谁来处理消息?
对应的处理人有可能是消息发送者也有可能不是,那么这时候就需要系统主动告诉对应的消息处理人有事情要处理了,而不是每个处理人自己去一直刷新界面。

二、实现构思设计

在上面的需求里面我们可以知道,实现的方式很简单,我们大可以在用户操作的那段代码后面加上一段发送websocket通知的代码,但是这样真的好吗,如果只有一两处还好,但是如果我们有几十个地方需要给前端推送消息呢?
有人说,可以写成一个工具方法,让业务代码去调用。没错确实可以这样,但是我觉得还是不够优雅,为什么呢?因为这样会造成我们的业务代码被入侵,破坏了方法的单一职责。
这时候我们就会想,既然是业务代码调用之后需要发送消息通知,那么AOP,没错,就是AOP。我们可以定义一个切面,然后在切面里面去对我们的业务方法进行增强就好了。
废话不多说,设计图献上:
springboot中优雅的使用websocket通信(分布式)
关于如何在Springboot里面使用WebSocket 请移步springboot里使用websocket
在上图里面,我们先关注左侧WebSocketServer---->AbstractWebSocketServer----->NoticeNumber这条线
这条线实现了服务器向客户端推送消息的功能
然后再看右边,我们生命了一个注解,一个切面,我们只需要在业务方法上面加上这个注解,业务方法就会被切面增强
现在我们需要把左右两边连接起来。
也就是右边如何通知左边向客户端推送消息呢?
这里我们使用redis的一个广播消息队列,可参考这篇文章用Redis实现RabbitMq消息广播
我们切面里面会调用一个消息发送的方法来通知左边的websocket进行消息推送

三、代码实现

websocketServer接口:
springboot中优雅的使用websocket通信(分布式)

AbstractWebsocketServer:
springboot中优雅的使用websocket通信(分布式)

实现子类:
springboot中优雅的使用websocket通信(分布式)
切面类的切面方法:
springboot中优雅的使用websocket通信(分布式)

四、如何使用
1、后端调用
无需侵入业务代码,仅仅加上一个注解就可以实现消息通知
springboot中优雅的使用websocket通信(分布式)
2、前端调用:
springboot中优雅的使用websocket通信(分布式)

五、结语

在这个实现里面由于使用了redis实现消息广播,所以它是适用于分布式系统的,在分布式场景里面,客户端只需要注册任意一个节点即可。