<script>
var btn = document.getElementById('btn1');
btn.addEventListener('click',function(){
var socket = io.connect('http://ws.vd.net/ws',{
reconnection: false
});
socket.on('connect',function(){
// 发起“脚手架安装”请求
socket.emit('b:message',{a:1}); socket.on('s:message',function(d){
console.log(d);
});
});
socket.on('error',function(err){
console.log(err);
})
});
</script>
nginx.conf
upstream io_nodes {
ip_hash;
server 127.0.0.1:3131;
server 127.0.0.1:3132;
server 127.0.0.1:3133;
server 127.0.0.1:3134;
}
server {
listen 80;
server_name ws.vd.net;
location / {
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_pass http://io_nodes;
}
}在本机绑定hosts地址后开启nginx服务,同时开启服务器,点击按钮建立ws连接成功。
服务端路由
服务端路由,意义在于“服务端做worker的负载均衡,并将选择的worker ip和端口渲染在页面,之后浏览器的所有ws连接默认连接到对应 ip:port的服务器中”。这样只要是服务端渲染的页面都可以采用这种方式实现。
如果页面采用前端异步渲染,仍可以采用这种方式,不过首先通过xhr请求向服务端获取需要握手的http服务器的ip和端口,然后在进行ws连接。
服务端路由的前提仍然是需要针对每个ws服务器分配一个端口,只不过去掉nginx由服务端做ip hash。采用服务端路由架构清晰,而且实现容易,兼容性好。
上帝进程路由
此处的上帝进程即为主进程,类似pm2进程。上帝进程路由则是在上帝进程层面上做请求的定向分发,保证请求主机和进程的一致性。在上帝进程中,针对每个请求的ip做hash,并对每一个ws服务器创建单独的http服务器用于握手升级。
简易代码:
var express = require('express'),
cluster = require('cluster'),
net = require('net'),
sio = require('socket.io');var port = 3000,
num_processes = require('os').cpus().length;
if (cluster.isMaster) {
var workers = [];
var spawn = function(i) {
workers[i] = cluster.fork();
workers[i].on('exit', function(code, signal) {
console.log('respawning worker', i);
spawn(i);
});
};
for (var i = 0; i < num_processes; i++) {
spawn(i);
}









