【问题标题】:Node Http Proxy Web Socket Balance节点 Http 代理 Web 套接字平衡
【发布时间】:2016-08-08 06:33:12
【问题描述】:

我需要能够在应用程序级别平衡 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);
});

【问题讨论】:

  • 可能duplicate?可能对你有帮助
  • @NiCkNewman 我可以很好地代理,但我需要根据接收到的数据进行平衡,而不会实际中断套接字连接。

标签: node.js web-services sockets proxy node-http-proxy


【解决方案1】:

这是一个例子。在这种情况下,客户端直接连接到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 等键。当找不到合适的上游服务器时,也值得进行一些错误处理,但这应该说明总体思路。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2019-11-13
    • 2020-08-10
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多