springboot中消息推送系统设计与实现 这里采用的是springboot+netty-socketio+rabbitmq
1.服务端消息推送,采用netty-socketio开源框架,这里选择的是netty-socketio:1.7.17 版本 注意:选择的版本要注意netty的版本一致问题,其他框架如果也用了netty,一定要保持netty版本一致,否则会影响websocket服务
2.netty-socketio多节点部署问题: 如果采用默认http请求进行ws协议升级方式,在多节点部署模式下,负载均衡策略容易导致多次连接不一致问题。 这里可以采用ws的方式只请求连接一次
3.服务端多节点部署,采用rabbitmq的广播模式,多个部署节点监听广播
4.websocket服务端口注册zk注册中心,采用的springcloud ZookeeperServiceRegistry注册器注册端口(注意:这里只是做到端口替换)
前端页面demo
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>NETTY SOCKET/.IO DEMO</title>
<base>
<script src="#34;></script>
<script src="#34;></script>
<style>
body {
padding: 20px;
}
#console {
height: 450px;
overflow: auto;
}
.username-msg {
color: orange;
}
.connect-msg {
color: green;
}
.disconnect-msg {
color: red;
}
</style>
</head>
<body>
<div id="console" class="well"></div>
</body>
<script type="text/javascript">
var socket;
connect();
function connect() {
// 此处userId为用户标识,后面推送时使用
var socket = io.connect('#39;, {
'path': '/socket.io',
'reconnection delay' : 2000,
'force new connection' : true,
'transports' : ['websocket']
});
socket.on('message', function(data) {
// here is your handler on messages from server
console.log(data)
});
socket.on('chatevent', function(data) {
// here is your handler on chatevent from server
console.log(data)
});
socket.on('connect', function() {
// connection established, now we can send an objects
// send json-object to server
// '@class' property should be defined and should
// equals to full class name.
var obj = { '@class' : 'com.sample.SomeClass'
}
socket.json.send(obj);
// send event-object to server
// '@class' property is NOT necessary in this case
var event = {
}
socket.emit('someevent', event);
});
}
</script>
</html>