springboot+webSocket+rabbitmq集群
1. 开发思路
WebSocket有多台服务器时,每台服务器只会存部分连接,而连接无法序列化存到redis,所以我们采用mq广播机制实现。
前端发生消息给所有人或者指定人,先将消息参数推送给rabbitmq,MQ交换机使用广播类型,每台服务器启动时,绑定匿名临时队列到指定交换机进行监听消息。每台服务器收到监听消息后调用各自WebSocket发送消息方法
1.1 webSocket服务器端开发
所有连接对象都放内Map<String, WebSocket> clients = new ConcurrentHashMap<String, WebSocket>()里面,key存放用户ID,value存放用户连接,可以根据自己需要做其他调整。Spring boot+WebSocket使用网上很多,这里只贴核心代码
定义全局线程安全MAP对象
前端连接时,将连接对象加入MAP对象
前端连接时参数带上用户ID
1.2发送消息给前端
1)Controller里面开发两个接口,一个发生给指定人,一个发生给全部人。里面调用rabbitmq方法,将消息推送给交换机(广播类型交换机)
2)每台服务器使用匿名临时队列绑定交换机,此步是实现集群核心。
监听里面再根据参数调用发生消息方法给前端
获取指定连接,发生给指定人
2. 主要代码文件解释
发生消息给全部人
UserController. sendMessageAll
发生给指定人
UserController. sendMessageTo
队列监听,绑定匿名队列与交换机关系
LogConsumerDirect
发生MQ消息到指定交换机方法
LogSendMq.sendMessageTo
LogSendMq.sendMessageAll
WebSocket连接接口开发
WebSocket
WebSocketUtil
因为只是写测试,MQ那块就直接在写在log消息文件
代码文件word里面有,码云可以下载word文档