2016-04-16 27 views
7

Websocket'i uygulama düzeyinde dengelemeye ihtiyacım var. Aldığım mesaj temelinde websocket isteğini ileri sürelim, proxy'de deşifre edin ve daha sonra bu verileri başka bir mantık kullanarak başka bir soket sunucusuna gönderelim.Düğüm Http Proxy Web Socket Balance

Ancak bunu yapamıyorum. Bu yazdığım ve yapmaya çalıştığım ilk kod. Bu İşte bir örnek sunucu

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

MÜŞTERİ

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

possible [duplicate] (http://stackoverflow.com/questions/21629752/using-node-http-proxy-to-proxy-websocket-connections)? Size yardımcı olabilir –

+0

@NiCkNewman Vekil olabilir ama aslında soket bağlantısı kırmadan alınan veri temelinde dengelemek gerekir. –

cevap

2

olduğunu. Bu durumda, istemci doğrudan direct.js'ye bağlanır ve daha sonra, upstream sunuculara (internal.js) bağlantıları iletir.

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 Bu örnekte

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

Eğer esaslı foo veya bar gibi kilit böyle dönmek findUpstream doldurmak gerekir istek üzerine veri. Doğru upstream sunucunun bulunmadığı durumlarda da bazı hataların ele alınmasına değecektir, ancak bu genel fikri açıklamalıdır.