nodejs实现tcp反向代理(优化,亲测)

nodejs实现tcp反向代理(优化,亲测)

背景:

  1. 公司的生产服务器环境是windows ,无法使用tcp 反向代理服务器 (nginx 或 haproxy )
  2. 公司用的mq 组件是个老的第三方组件,性能不佳,为了避免mq性能瓶颈,到时候可能需要部署集群,所以研究了一下windows反向代理

tcpProxy.js


/**
 * tcp反向代理
 * net模块官方文档 https://nodejs.org/api/net.html
 * Created by zhuangjiesen on 2017/12/7.
 */

console.log('script starting...')
var net = require('net');
//反向代理服务监听
var LOCAL_PORT  = 11024;
//反向代理远程服务器
var REMOTE_PORT = 38888;
//反向代理地址
var REMOTE_HOST = "192.168.1.2";

function targetServer(){
    this.host;
    this.port;
}


var targetServerList = [];
var targetServer = new targetServer();
targetServer.port = REMOTE_PORT;
targetServer.host = REMOTE_HOST;
targetServerList.push(targetServer);
function getServer(){
    return targetServerList[0];
}


var invokeTime = 0;
var tcpProxyServer = net.createServer(function (clientSocket) {
    clientSocket.on('data', function (msg) {
        console.log('  ** START **');
        console.log('<< From client to proxy ' );
        // console.log('<< From client to proxy ' , msg.toString());
        //连接复用
        var serviceSocket = null;
        if ((serviceSocket = clientSocket.serviceSocket)) {
            // console.log('<<  proxy has created ....', msg.toString());
            serviceSocket.write(msg);
        } else {
            var serviceSocket = new net.Socket();
            clientSocket.serviceSocket = serviceSocket;
            serviceSocket.connect(parseInt(getServer().port), getServer().host, function () {
                // console.log('>> From proxy to remote', msg.toString());
                serviceSocket.write(msg);
            });
            serviceSocket.on("data", function (data) {
                // console.log('<< From remote to proxy', data.toString());
                clientSocket.write(data);
                console.log('invokeTime : ' , invokeTime ++ )
            });
            serviceSocket.on('end', function() {
                console.log(' == serviceSocket disconnected from server');
            });
            //服务端连接出问题,断开客户端
            serviceSocket.on('error', function(err) {
                console.error(' == serviceSocket has error ' , err);
                clientSocket.end();
            });
        }
    });
    clientSocket.on('end', function() {
        console.log('== clientSocket disconnected from server');
    });
    clientSocket.on('error', function(err) {
        console.error('== clientSocket has error : ' , err);
    });
});



tcpProxyServer.on('error', function(error) {
    console.error('== tcpProxyServer has error : ' , error);
});

//创建反向代理服务
tcpProxyServer.listen(LOCAL_PORT);
console.log(" TCP server accepting connection on port: " + LOCAL_PORT);
console.log(" TCP proxy has started successfully! ");

/*
* 300 毫秒检测连接
* */
var periodServerTest = setInterval(function(){
} , 300) ;


网上找到的代码,优化:

1.连接复用
2.客户端关闭后,需要服务端也关闭连接

经过测试(没仔细测) ,反向代理了个mq ,给mq发送消息,性能不错

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值