2016-04-16 13 views
7

アプリケーションレベルでwebsocketのバランスをとる必要があります。私が受け取ったメッセージに基づいてWebsocketリクエストを転送し、プロキシでそれをデコードし、そのデータをいくつかのロジックを使って別のソケットサーバーに送信します。ノードHttpプロキシWebソケットバランス

しかし、私はこれを行うことができません。これが最初に書いたコードで、これをやろうとしています。これは、ここでは例のサーバー

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); 

CLIENT

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

可能[複製](http://stackoverflow.com/questions/21629752/using-node-http-proxy-to-proxy-websocket-connections)? –

+0

@NiCkNewmanプロキシは正常に動作しますが、実際にソケット接続を切断せずに受信したデータに基づいてバランスをとる必要があります。 –

答えて

2

です。この場合、クライアントはouter.jsに直接接続し、次に外側のサーバー(inner.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); 

outer.js 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'); 
}); 

この例では、このようなfooやベースbarなどのキーを返すためにfindUpstreamに記入する必要がありますリクエスト内のデータに基づいています。また、適切な上流サーバーが見つからない場合には、いくつかのエラー処理を行う価値がありますが、これは一般的な考え方を示すはずです。

関連する問題