节点Http代理Web套接字平衡

我需要能够在应用程序级别上平衡WebSocket。 让我们说,前面的websocket请求基于我收到的消息,解码它的代理,然后使用该数据发送到另一个套接字服务器使用一些逻辑。

但我无法做到这一点。 这是我写的最初的代码,并试图做到这一点。 这是服务器

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

客户

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

这是一个例子。 在这种情况下,客户端直接连接到outer.js,然后将连接转发到上游服务器(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'); }); 

在这个例子中,您需要填写findUpstream以根据请求中的数据返回foobar类的键。 当找不到适当的上游服务器时,也应该加上一些error handling,但这应该说明一般的想法。