节点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
以根据请求中的数据返回foo
或bar
类的键。 当找不到适当的上游服务器时,也应该加上一些error handling,但这应该说明一般的想法。
- 尝试使用协议分析器(Charles)捕获node.js httpstream量,但无法使节点使用代理
- 在NodeJS中通过SOCKS5代理进行http请求
- 我可以在TypeScript中使用自定义模块parsing函数(如“proxyquire”)来代替require()吗?
- express-http-proxyerror handling
- 如何创build一个转发代理来查看使用Node.js的网站
- Nodejs请求“代理”选项不是通过定义的主机的路由请求
- 在node.js中调用https Web服务(在代理后面)
- Bower错误隧道套接字无法build立,原因=parsing错误
- 在量angular器中为e2etesting设置https代理