聊聊我的PHP转Go之路

19 阅读4分钟

通过聊聊公司项目的重构历程,来说说我的php转Go的历程。

先简单说说项目在php阶段的为了提升性能的三个阶段优化之路。

第一阶段

此时使用的技术栈服务器使用apache+php模块,开发框架为thinkphp, 数据库mysql;此时项目的接口主要直接操作数据库,数据库分为只读库和读写库,此时因为使用场景较少,暂时没有出过问题,当流量上来后使用的方法就是无脑堆服务器。曾经有一次活动峰值流量直接堆了50台服务器,即便是如此在一次在线人数达到7w-8w的时候,服务全线瘫痪。

第二阶段

服务器依然使用的apache+php模块,在接口中引入了redis缓存,此时日常服务器减少了一大半,峰值服务瘫痪的次数越来越少了。

第三阶段

服务器换成了nginx+php-fpm;对接口进行了持续优化,引入了redis和mysql连接池,并且将一些更新不怎么频繁的数据,存入json文件中,然后引入cdn缓存。此后服务器就稳定下来了,服务器最多就是20台左右了,相比初期服务器节省了将近30台,这是一笔不小的成本。

当我在学习和使用其他语言的时候,或者本地运行多个语言的项目,带来的复杂的开发环境已经混乱的语言版本管理,会给我的开发带来不小的额外成本。后来我发现了 flyenv,简单的介绍下flyenv,这不仅仅是版本管理器,而是一个完整的原生生态系统,转为全栈开发打造。

FlyEnv 是一款一体化全栈环境管理工具。帮助开发者快速设置本地开发环境。

它通过 极速多版本切换全栈技术支持无缝跨平台体验,简化开发流程。无论你是使用 PHP、NodeJS、Java、Go 还是 Python,FlyEnv 都能通过一条命令集成所有必要工具,消除配置烦恼,让你专注于真正重要的事情——创造,而非调试

简而言之,FlyEnv 提供了一个完整的运行环境,帮助用户开发和调试诸如 Laravel、WordPress、Yii2、FastAdmin、NestJS、SpringBoot、Gin、Beego、Django、Flask 等应用程序。

然后是使用Go语言重构项目的三个阶段

第一阶段

因此时刚开始学go,所以第一阶段的重构,用我个人的说法就是项目的翻译,直接照着php的目录和接口逻辑,逐个服务的将php的应用翻译为go语言。仅仅如此性能就提升了一大截,当在线认数达到7w-8w时,用了10台服务器,服务也没有瘫痪过。

第二阶段

在第一阶段重构完成后,根据第一次重构的经验又针对性的学习了一段时间后,开始了第二次的重构,这次重构比较彻底,不再参考php项目的目录结构,以保证高性能为唯一标准,项目目录进行了简化,使用了本地缓存,项目整体结构变成了  本地缓存-》redis缓存-》数据库的两级缓存模式。并且对于部分操作使用了协程进行异步化操作。对于数据库的增加、修改、删除使用队列进行异步删除。热点数据提前预热进redis缓存中。本阶段重构后,日常服务器保持2台,峰值时服务器5台,并且服务也从来没有瘫痪过。

第三阶段

第三阶段的重构处在规划阶段还未开始,因为不是所有的功能模块在峰值访问都很频繁因此计划将单体应用重构为微服务,将访问量比较大的功能模块和网关服务重构为openresty+lua+go的技术栈,目前还在开发中。

通过项目的重构来说说将php项目转为go后带来的几点好处吧:

  • 性能相对于php来说有了大幅度的提升。
  • go的强类型让项目的代码相对于php来说更加整洁,当然这点就是因人而异了。
  • go的夸平台运行让代码有了更强的统一性,之前php经常出现本地可以到服务器上就报错了。
  • go编译的二进制文件部署更加方便,尤其在服务器迁移的时候,php有过一次服务器迁移只是装环境就让头疼死了都。