我需要什么本质上是反向代理但我需要在Node.js中,因为我将不得不放入一些自定义功能。
gateway
将是唯一可见的服务,它需要将流量转发到内部服务网络。一个简单的302在这里不起作用。
如果给出Node.js的异步特性,我怎样才能真实地实现这个呢?
是否有用于此的众所周知的库?
答案 0 :(得分:1)
使用纯核心模块(可能有点难看,但效率很高):
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);
如果您不喜欢此示例,可以尝试:https://www.npmjs.org/package/turtle.io
答案 1 :(得分:1)
我使用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);
答案 2 :(得分:1)
对于使用reactor模式(如节点)的简单反向代理,我会查看nginx。但是,你提到你想使用节点添加一些自定义功能,那么这是一个现实的目标吗?绝对!在设计反向代理时,需要考虑以下几点:
祝你的反向代理努力好运!如果我发生任何其他事情,我会更新此信息。