simplewebsocket
webSocket集群功能简单实现
在tomcat集群环境下,客户端只能与一个tomcat建立websocket连接,如果服务器向客户端发消息,则不知道哪个tomcat与此客户端建立的连接.
如果是http的会话信息可以通过缓存共享(如用Redis存会话信息), 但是webSocket的连接是不可以序列化的,也就没法共享.
所以解决问题的思路是:
当一个客户端与tomcat建立websocket连接, 则把此连接信息与相应的sessionid或用户id形成键值对放在本机内存的map中.
在集群环境下还要引入消息队列的概念, 可以用订阅/发布的模式,可以采用自己熟悉的消息框架, 此项目中采用了hazelcast的消息队列(简单,不需要额外启服务), tomcat启动时自动启动消息监听(代码中已实现), 当服务端向某个客户端通信时, 先在集群的tomcat上发布消息, 此消息包含sessionid及向客户通信的内容, 当订阅了消息的tomcat收到消息后, 检查本机的map中是否包含此sessionid, 如果不包含则忽略,如果包含则取出此sessionid对应的连接,然后向客户端发送相应内容进行交互.
项目使用
1.先将webSocket-hazelcast.xml放到自己项目的WEB-INF下.
2.在web.xml中注册监听事件com.tw.listener.WebSocketListener
3.启动tomcat
webSocket-hazelcast.xml说明
此配置文件主要配置消息要广播或发送到指定IP的服务器地址列表.参考其中的解释修改IP即可
注意:
需要Tomcat8以上,因为websocket需要使用到websocket-api.jar的包