Golang TcpProxy和Nodejs TcpProxy

前端之家收集整理的这篇文章主要介绍了Golang TcpProxy和Nodejs TcpProxy前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

自己平时的工作基本都在PHP和nodejs之间徘徊,但是目前面对python和java的猛烈攻击呢,其实内心有一种隐隐的痛“PHP是世界上最好的语言“,”nodejs在cpu密集时服务彻底瘫痪"。。。

看了半个月python真实发现,其实它太像PHP语言了,所以基本不用怎么理解就会了。golang看了1个多月了真的得多写多看源代码才能收获,别看才30几个关键字但是内容真的很多,golang的性能是真的高可以大大缩减服务器开销,举个例子web服务中PHP需要100台机器,那么golang可能只需要10台甚至更少!

最近在研究MysqL proxy,其实MysqL本身是支持代理的,但是想自己尝试下这样就会很灵活:

  • 灵活slb MysqL负载均衡
  • 读写直接通过proxy直接进行判断
  • 提前预警或拒绝危险性sql
  • ...太多太多太多好处

以下是golang MysqL proxy的代码

package main
 
import (
       "net"
       "fmt"
       "time"
)
 
const (
       MysqL_ADDRESS = "mysq-host"
       MysqL_PORT = "3306"
)
 
func main() {
       listener,err := net.Listen("tcp",":1234")
       if err != nil {
              fmt.Println("tcp",err.Error())
              return
       } else {
              fmt.Println("tcp",listener.Addr(),"success")
       }
 
       for {
              user,err := listener.Accept()
              if err != nil {
                     fmt.Println("accept error: ",err.Error())
                     continue
              }
              go proxyRequest(user)
       }
}
 
 
//打理用户请求
func proxyRequest(user net.Conn) {
 
       fmt.Println(user.LocalAddr())
       bytes := make([]byte,10240)
 
       conn,err := net.Dial("tcp",MysqL_ADDRESS + ":" + MysqL_PORT)
 
       if err != nil {
              fmt.Println(conn.RemoteAddr(),"error:",err.Error())
              conn.Close()
              return
       }
 
       ch := make(chan bool,1)
       go proxyResponse(user,conn,ch)
 
       for {
              n,err := user.Read(bytes)
              if err != nil {
                     break
              }
              fmt.Println(string(bytes[:n]))
              conn.Write(bytes[:n])
       }
 
       defer close(ch)
 
       select {
       case <-ch:
              conn.Close()
              user.Close()
              fmt.Println("proxy over")
       case <-time.After(time.Second * 60):
              fmt.Println("proxy timeout")
       }
 
}
 
//代理服务的返回给用户
func proxyResponse(user net.Conn,service net.Conn,ch chan bool) {
       bytes := make([]byte,10240)
 
       for {
              n,err := service.Read(bytes)
              if err != nil {
                     break
              }
              user.Write(bytes[:n])
       }
 
       ch <- true
}

以下是nodejs简单的proxy

var net = require('net');
var model = require('../../models/proxy');
var trace = require('../../libs/trace');

//代理表
var proxys = [];
//tcp server
var server = null;
//proxy information
var information = {count: 0,success: 0,error: 0};

/**
 * 启动服务
 * @param info array
 * @param callback function
 */
exports.start = (info,callback) => {
    model.getProxyListFromServer(info.id,(err,result)=> {
        if (err) {
            callback(err,err);
        } else {
            proxys = result;
            initServer(info.port,info.to_host,info.to_port);

            callback(null);
        }
    });
};


/**
 * 停止服务.
 * @return bool
 */
exports.stop = function () {
    if (server && server.listening) {
        server.close();
        server = null;
        return true;
    }
    return false;
};


/**
 * 获取信息
 * @return object
 */
exports.getInfo = () => {
    return information;
};


/**
 * 初始化tcp proxy server.
 * @param port
 * @param toHost
 * @param toPort
 */
function initServer(port,toHost,toPort) {
    server = net.createServer((client)=> {
        information.count++;

        client.on('end',() => {
            connect.end();
        });

        var connect = net.createConnection({host: toHost,port: toPort},(err)=> {
        });
        connect.on('error',(err)=> {
            information.error++;
        });
        connect.on('end',()=> {
            information.success++;
        });

        client.pipe(connect);
        connect.pipe(client);

        // client.on('data',function (data) {
        //     var buf = Buffer.from(data);
        //     console.log('data: ' + buf.toString());
        // });
    });

    server.listen(port,(err) => {
        if (err) {
            trace.log('proxy server error',err);
            process.exit();
        }
        trace.log('proxy server started',port);
    });
}

猜你在找的Go相关文章