回忆当年从PHP转GO的经历

141 阅读3分钟

go.png

前言

2018年入职了一家互联网车企,当时我们部门属于车联网前端小组的后端组,开发语言是PHP, 框架用的tp。 fpm cgi 那一套虽然健壮性良好,但是随着数据量的增多,性能不太满足了,因为每次收到请求,都要重新加载代码到内存, 然后还是单线程, 必须依赖apache|nginx 代理转发请求。 简单的应付后台运营管理的增删改查还行,但是要作为基础服务,给别的代码调用性能就有明显的瓶颈了。

workerman 引入

技术经理引入了workerman框架(php 的轻量级内存常驻框架, 纯PHP写的框架), 这框架解决了每次请求都要加载资源到内存的性能问题, 也不需要nginx|apache代理了, 能自己监听端口,也能使用长连接技术了。 作为普通的服务也足够用了, 有将近1年的时间我们后端小组都是用这个框架来做业务。

easyswoole 框架引入

我们的网关是用easyswoole写的, 它不但是内存常驻而且支持io异步; 因为是纯c写的扩展框架, 性能比 workerman 框架又好上不少,主要体现在语言代码转换成机器码上。 但是作为中间件, 即便是easyswoole的并发能力依然是有上限的,虽然它号称可以跟java比并发量。

转go

让我们技术经理下定决心转go 是有一个契机:跟其他子公司的go技术比并发量,就是每秒处理请求数(qps); easyswoole虽然是c写的,而且有异步功能, 但是它的异步却是有局限性的,代码里同一个线程生成的协程,只能由同一个cpu执行; 但是go不一样, 同一个线程生成的多个协程,可以由不同的cpu去执行,果然~ 『为并发而生』的slogan是有真材实料的~ ; 后面比试的结果是 go: 3000qps, swoole: 1000qps ; 后面疫情期间技术经理就用go重构了网关, 然后强制我们转go, 虽然都知道后端那点业务量,用啥语言写都能胜任,但是多学一门静态语言也是有好处的! 😄

初学golang

刚学go最让我头疼的,还是类型转换和断言的问题, 特别是从php 或者 python等弱语言转过来的同学,应该深有体会; 有一次调用java端的接口,还是习惯了php的数组模式, 用了map[string]interface{} 类型去获取返回的数据, 那时候不熟悉,不懂得用结构体去装数据... 然后数据返回的层级有好几层, 每次拿下一层数据都要断言一下... 不能像php那样直接 $data['xxx']['yyy'] 这样获取. 感觉很痛苦, 后来慢慢用习惯和自学, 就知道可以用结构体的方式去装数据 就不需要断言了, 直接Unmarshal 就可以!

暂时就这样, 后面会分享自己在项目中用go的小技巧和经验。 go 语言目前虽然小众,但是市场非常大! 我是一个go开发者,更是爱好者。 希望能结识更多志同道合的小伙伴一起研究! 😄