我使用Node集群,在每个Worker上都有一个正在运行的WebSocket服务器.Master正在运行一个HTTP服务器.
在主HTTP服务器上,我想要一个HTTP升级调用实现,它将把调用者连接到特定的Web套接字.
为什么?我希望能够将用户连接到正确的WebSocket,但我希望通过作为本地主机的单个入口点来实现:8000.连接到LOCALHOST:8000可能会无缝连接到LOCALHOST:8001.
我的 idea 是使用类似以下参数的参数调用Upgrade:
wscat -c ws://localhost:8000/?id=5
此调用应转到主服务器,并且主服务器将转发此升级调用并与本地主机:8005建立连接.
我以为我可以简单地使用worker.end()将升级参数转发给Worker,但这并不真正起作用,我在Worker中收到的对象遗漏了很多东西,这可能是我不知道的一些JS基础知识.
以下是我天真的实现:
var http = require('http');
var cluster = require('cluster')
var ws = require('ws');
var NumberOfInstances = 5;
if (cluster.isMaster) {
var forks = []
for (var i=0; i < NumberOfInstances; i++) {
forks.push(cluster.fork());
}
server = http.createServer((req, res) => {
res.writeHead(200);
}).listen(8000);
server.on('upgrade', (request, socket, head) => {
var params = new URL(`https://localhost:8000${request.url}`);
var id = parseInt(params.searchParams.get('clusterId')) - 1;
// How do I forward upgrade??
forks[id].send({r: request, s: socket, h: head});
})
} else {
portStr = `800${cluster.worker.id}`;
wss = new ws.WebSocketServer({
port: portStr
});
wss.on('connection', (ws, request) => {
console.log(`${cluster.worker.id} got connection.`);
})
process.on('message', masterMessage => {
// This absolutely doesn't work.
wss.handleUpgrade(masterMessage.r, masterMessage.s, masterMessage.h, (ws) => {
wss.emit('connection', ws, masterMessage.r);
})
})
}