Golang TcpProxy和Nodejs TcpProxy

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

自己平時的工作基本都在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 servervar server = null;//proxy informationvar 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);    });}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.