springboot + websocket + redis实现多服务器消息主动推送

集成的东西就不多讲了,导入依赖jar包,然后codeing就行了,主要说说过程中遇到的几个坑。

第一个坑就是多服务器的问题,由于项目是多节点通过nginx分发请求来实现的,所以会导致长连接建立在一台服务器上,后续的请求回被分发到另一台服务器上,但是当前服务器并没有建立长连接,导致消息发送不到前端。

首先想到的方法是websocket的session共享,通过将session序列化到redis里来实现,但是websocket的session不支持序列化,这个方法pass。然后想到队列来解决,通过发布消息,然后订阅的流程,这样多台服务器都能订阅到消息,然后都去发送消息,这样就能解决了。但是感觉这个用消息队列太大材小用了,就想到了redis的订阅/发布功能,将消息发不到redis的指定频道上面,然后再redis的配置文件中配置订阅就可以,这样多台服务器定拿到了消息内容,都去发送,只有建立了长连接的那台服务器才能发送成功,这样就解决了多服务器消息发送不准确的问题了。

 

第二个坑是建立长连接在一台服务器上,前端调用send给后台发送消息有可能被分发到另一台服务器上,由于前端隔一分钟会发送一次请求,来确认长连接有没有断,断了的话会进行重连,如果请求被分发到了另一台服务器上的话,这样消息就会发送失败,前台就不能确定是请求分发的问题还是真的是长连接断了。最后采取的解决办法是,nignx固定ip请求到一台服务器上。

 

第三个坑是springboot部署到服务器上启动之后,主程序的run方法之后的代码没有执行,导致websocket需要的应用上下文对象没有注入进去,导致连接websocket报错了。在本地启动项目,主程序的run方法后面的代码是可以执行的,不知道为什么到服务器上就不能执行了,最后采用了远程调试jar包的方法,定位到了错误。解决办法是既然后面的代码不能执行,那就把代码写到run方法的前面去,给springApplication对象添加了一个监听,实现ApplicationListener接口,这样就能在启动的同时拿到应用上下文对象了。

解决了这三个坑之后,websocket多服务器下实现消息的主动推送就完成了。

 

你可能感兴趣的:(springBoot,webSockrt,java,spring)