几个node.js进程之间的通信

时间:2011-08-25 14:24:38

标签: sockets node.js

我有3个node.js应用程序(A,B,C)。 A是一个入口点,我喜欢所有到达此入口点的请求被重定向到B或C(取决于请求中参数的值)。

目前我在A中使用res.redirect(我正在使用expressjs框架)。这工作正常,除了它不是真的透明(我可以从外面看到原始请求已被重定向)。

要解决这个问题,我会让B和C监听套接字而不是端口号,但我不知道如何将请求重定向到B或C使用的套接字。
关于如何让2个node.js通过套接字进行通信的任何想法?

**更新**

I have changed the code of A to use node-proxy:  

app.all('/port/path/*', function(req, res){

    // Host to proxied to
    var host = 'localhost';

    // Retrieve port and build new URL
    var arr_url = req.url.split('/');
    var port = arr_url[1];
    var new_url = '/' + arr_url.slice(2).join('/'); 

    console.log("CURRENT URL:" + req.url);  // url is /5000/test/...
    console.log("NEW URL    :" + new_url);  // url is /test/...

    // Change URL
    req.url = new_url;

    var proxy = new httpProxy.HttpProxy();
    proxy.proxyRequest(req, res, {
       host: host,
       port: port,
       enableXForwarded: false,
       buffer: proxy.buffer(req)
    });
    console.log("Proxied to " + host + ':' + port + new_url); 

    // For example: the url is localhost:10000/5000/test
    // the log tells me 'Proxied to localhost:5000/test' => that is correct
    // But... I do not get any return
    // If I issue 'curl -XGET http://localhost:5000/test' I get the return I expect

});

这有什么明显的错误吗?

2 个答案:

答案 0 :(得分:1)

您正在使用其他进程侦听不同端口的正确轨道。您所谈论的内容称为反向代理。如果它的http,它非常直接用node-http-proxy来实现:

https://github.com/nodejitsu/node-http-proxy

您希望像代理表一样设置内容:

var options = {
  router: {
    'foo.com/baz': '127.0.0.1:8001',
    'foo.com/buz': '127.0.0.1:8002',
    'bar.com/buz': '127.0.0.1:8003'
  }
};

答案 1 :(得分:0)

我刚刚在这里为node-http-rpoxy模块提出问题https://github.com/nodejitsu/node-http-proxy/issues/104

显然它现在确实可以使用unix套接字,但是像这样(可能会有变化)。

var options = {
    router: {
        'foo.com/baz': ':/tmp/nodeserver.sock',
    }
};

它只需要一个冒号来使用套接字路径作为端口值。