我需要一个反向代理,但我需要在Node.js中实现它,因为我需要添加一些自定义功能。
这个“网关”将是唯一可见的服务,它需要将流量转发到内部服务网络。一个简单的302并不能解决这个问题。
考虑到Node.js的异步特性,我应该如何实现这个过程?
是否有任何众所周知的库用于此?
这个“网关”将是唯一可见的服务,它需要将流量转发到内部服务网络。一个简单的302并不能解决这个问题。
考虑到Node.js的异步特性,我应该如何实现这个过程?
是否有任何众所周知的库用于此?
我已经使用node-http-proxy
实现了这一点,其中http://first.test/和http://second.test/是主机名。
var http = require('http'),
httpProxy = require('http-proxy');
var proxy = httpProxy.createProxyServer({});
// reverse proxy server
http.createServer(function (req, res) {
var target = '';
if (req.headers.host.match(/first.test/)) {
target = 'http://127.0.0.1:8001';
} else if (req.headers.host.match(/second.test/)) {
target = 'http://127.0.0.1:8002';
}
console.log(req.headers.host, '->', target);
proxy.web(req, res, { target: target });
}).listen(8000);
// test server 1
http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('8001\n');
res.write(JSON.stringify(req.headers, true, 2));
res.end();
}).listen(8001);
// test server 2
http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.write('8002\n');
res.write(JSON.stringify(req.headers, true, 2));
res.end();
}).listen(8002);
使用纯核心模块(可能有点丑陋,但高效):
var http = require('http');
http.createServer(function (request, response) {
if (request.headers.host === 'api.test') {
// request data from 172.17.0.1:80
} else if (request.headers.host === 'test') {
// request data from 172.17.0.2:80
} else {
// Do something else
}
}).listen(80);
turtle.io
。不过我用 node-http-proxy
成功实现了这个功能(代码如下)。还是非常感谢你的回复,我们的思路是一致的,只是我加入了 proxyServer
就可以了。感谢你的建议! - Adam K Dean{ "api.test" : function() { ... }, ...}
可以用作一个简单的分发表。 - tadman