博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang TcpProxy和Nodejs TcpProxy
阅读量:7084 次
发布时间:2019-06-28

本文共 3937 字,大约阅读时间需要 13 分钟。

自己平时的工作基本都在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);    });}

转载地址:http://cdmml.baihongyu.com/

你可能感兴趣的文章
win10 vmware下Linux系统联网
查看>>
POJ3678:Katu Puzzle——题解
查看>>
Oracle的基本数据类型(常用)
查看>>
Could not open ServletContext resource [/WEB-INF/Dispatcher-servlet.xml]
查看>>
9.Maven之(九)依赖关系
查看>>
77.深入理解nodejs中Express的中间件
查看>>
Oracle递归查询
查看>>
Web前端开发十日谈
查看>>
如何在cell内部操作控制器的一些行为
查看>>
第二个spring,第一天
查看>>
UVa 10795
查看>>
String和StringBuffer区别
查看>>
编程需要知道多少数学知识?
查看>>
虚拟空间,malloc
查看>>
PLL详解
查看>>
OSG闪存
查看>>
irssi忽略退出,加入消息
查看>>
从源码带你看懂functools的partial方法
查看>>
LeetCode:434. Number of Segments in a String
查看>>
Matplotlib 绘图与可视化 一些属性和错误
查看>>