2016-04-16 34 views
7

Ho bisogno di bilanciare websocket a livello di applicazione. Diciamo di inoltrare la richiesta di websocket sulla base del messaggio che ho ricevuto, decodificarlo su proxy e quindi usare quel dato per inviarlo a un altro server socket usando un po 'di logica.Nodo Http Proxy Web Socket Balance

Ma non sono in grado di farlo. Questo è il codice iniziale che ho scritto e sto cercando di farlo. Questo è il server

var http = require('http'); 
var httpProxy = require('http-proxy'); 
var WebSocket = require('ws'); 

var WebSocketServer = require('ws').Server; 
var wss = new WebSocketServer({ port: 8080 }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

var proxy = httpProxy.createServer({target: 'ws://localhost:8080', ws:true}); 


var server = httpProxy.createServer(function(req, res) { 
    //SOME LOGIC HERE TO PARSE WS DATA AND SEND TO WS SERVER 
    proxy.ws(req, res, { target: 'ws://localhost:8080'}); 
}).listen(8014); 

CLIENTE

var http = require('http'); 
var httpProxy = require('http-proxy'); 
var WebSocket = require('ws'); 


var ws = new WebSocket('ws://localhost:8014/'); 

ws.on('open', function() { 
    ws.send("CLIENT"); 
}); 

ws.on('message', function (msg) { 
    console.log(msg); 
}); 
+0

possibile [duplicato] (http://stackoverflow.com/questions/21629752/using-node-http-proxy-to-proxy-websocket-connections)? Potrebbe aiutarti –

+0

@NiCkNewman Posso proxy bene, ma ho bisogno di bilanciare sulla base dei dati ricevuti senza effettivamente rompere la connessione socket. –

risposta

2

Ecco un esempio. In questo caso il client si connette direttamente a outer.js che poi inoltra le connessioni ai server upstream (inner.js).

outer.js

var http = require('http'); 
var httpProxy = require('http-proxy'); 

var proxies = { 
    foo: new httpProxy.createProxyServer({ 
    target: { 
     host: "foo.com", 
     port: 8080 
    } 
    }), 
    bar: new httpProxy.createProxyServer({ 
    target: { 
     host: "bar.com", 
     port: 8080 
    } 
    }) 
    // extend this... 
}; 

var findUpstream = function(req){ 
    // TODO return key for lookup in @proxies 
}; 

var proxyServer = http.createServer(function (req, res){ 
    var upstream = findUpstream(req); 
    proxies[upstream].web(req, res); 
}); 

proxyServer.on('upgrade', function (req, socket, head) { 
    var upstream = findUpstream(req); 
    proxies[upstream].ws(req, socket, head); 
}); 

proxyServer.listen(8014); 

inner.js

var WebSocketServer = require('ws').Server; 
var wss = new WebSocketServer({ port: 8080 }); 

wss.on('connection', function connection(ws) { 
    ws.on('message', function incoming(message) { 
     console.log('received: %s', message); 
    }); 
    ws.send('something'); 
}); 

In questo esempio che dovrete compilare il findUpstream per restituire la chiave come foo o bar base sui dati nella richiesta. Vale anche la pena di inserire alcuni errori nella gestione di quando non è stato trovato il server upstream corretto, ma questo dovrebbe illustrare l'idea generale.