自己平时的工作基本都在PHP和nodejs之间徘徊,但是目前面对python和java的猛烈攻击呢,其实内心有一种隐隐的痛“PHP是世界上最好的语言“,”nodejs在cpu密集时服务彻底瘫痪"。。。
看了半个月python真实发现,其实它太像PHP语言了,所以基本不用怎么理解就会了。golang看了1个多月了真的得多写多看源代码才能收获,别看才30几个关键字但是内容真的很多,golang的性能是真的高可以大大缩减服务器开销,举个例子web服务中PHP需要100台机器,那么golang可能只需要10台甚至更少!
最近在研究MysqL proxy,其实MysqL本身是支持代理的,但是想自己尝试下这样就会很灵活:
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); }); }