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