将客户端从一个Node.js服务器重定向到另一个Node.js服务器



我正在创建一个socket服务器,像这样:

var net = require('net');
net.createServer(function (socket) {
//Run code here, to select where to redirect this client
}).listen(5000);

这将是我的主服务器,我决定在哪里重定向客户端(例如,我希望所有来自特定区域的客户端连接到特定服务器,但我希望主服务器决定,因为这不仅仅是关于地理区域,而是一些其他数据来分析,以决定在哪里重定向客户端)。

我想以某种方式将客户端重定向到另一个Node.js服务器上运行相同的"localhost",但不同的端口而不丢失套接字连接,并且没有过热/饱和的"主服务器",我希望它是干净的所有通过它旅行到这个其他服务器的连接。

你正在做的是一个TCP代理。我在下面写了一个基本的。函数getServerBasedOnAddress是您选择代理到哪个服务器的地方。我只是随便选了一个,因为我不知道你需要什么逻辑。

var net = require('net');
// The servers we will proxy to
var upstreamServerAddresses = [
    {address: '127.0.0.1', port: '3000'},
    {address: '127.0.0.1', port: '3001'},
    {address: '127.0.0.1', port: '3002'},
];
// This is where you pick which server to proxy to
// for examples sake, I choose a random one
function getServerBasedOnAddress(address) {
    return upstreamServerAddresses[Math.floor((Math.random() * 3))]
}
// Create the proxy server
net.createServer(function (socket) {
    socket.on('data', function(data){
        upstream = getServerBasedOnAddress(socket.remoteAddress);
        net.connect(upstream.port, upstream.address, function(connection){
            this.write(data);
        });
    })
}).listen(5000, function(){
    console.log("Ready to proxy data");
});
// Create the upstream servers
for(var i = 0; i < upstreamServerAddresses.length; i++){
    var upstream = upstreamServerAddresses[i];
    net.createServer(function (socket) {
        socket.on('data', function(data){
            console.log("Received some data on " + upstream.address + ":" + upstream.port);
            console.log(data);
        });
    }).listen(upstream.port);
}
如我所说,这是一个简单的例子。在实际生活中,您可能希望进行一些更改,例如不在每个数据包上连接到客户机,而是维护持久连接。您可能还希望覆盖上游服务器不可达的情况。

您可能还想使用类似异步库的东西来确保在启动代理服务器之前所有客户端都已启动,因此不会丢失数据。

最新更新