从PHP迁移⾄Golang-基础篇
1、Why Not PHP
使⽤PHP构建的WEB程序,随着业务发展到⼀定体量之后,都不得不⾯临以下⼀些问题:
业务功能不断扩张,如何避免某单⼀业务功能故障影响整体,维持系统健壮性
业务逻辑复杂度不断上升,如何解耦与模块化,降低系统复杂性
⽹站访问量不断攀升,如何实现⾼并发,实现系统⾼可⽤性
计算密集型业务的出现,如何快速适应需求,提升⽹站性能
...
对于PHP⽽⾔,在业务发展初期,可以快速实现业务原型,满⾜需求,但是在发展的中后期就显得略有点后劲不⾜。
因为PHP在⾼并发、多进程/线程以及密集计算领域并不擅长。这种情况在swoole出现之后得到了很⼤的缓和。
但是,随着微服务架构的兴起以及容器时代的到来,这种情况⼜再次加剧。因为PHP⼤都需要借助Nginx和PHP-FPM或类似软件来进⾏进程管理,这对于部署的微服务意味着部署PHP项⽬代码的同时必须同时包括PHP-FPM和Nginx,这除了增加资源成本也降低了效率。
2、Why Golang
那么,为什么是Golang呢?
⾸先,Golang与PHP很像,都是类C语⾔,可以很好的进⾏『知识迁移』
其次,Golang在性能和开发效率上有很好的平衡,语法简单,语⾔层⾯上⽀持并发编程,且基础库健全,部署容易。
最重要的是,Golang在微服务与容器领域有很好的基础,后期系统可完美实现微服务化与容器化。
如何运行php项目当然了,即便如此,PHP还是世界上最好的语⾔。
3、How To
做好了思想上的准备之后,就可以开始确⽴技术⽅案了。
任何⼤型系统的重构都不可能是⼀蹴⽽就,顷刻之间发⽣的,需要⼀个循序渐进的过程。并且,在此重构过程中,⼤前提必须保持现有系统的所有业务照常运⾏,所以需要确⽴的是⼀个对系统基本⽆损的分模块逐步替换的⽅案。
回归到我们当前的系统架构:每台服务器上均部署相同的PHP项⽬代码,统⼀由PHP-FPM解释执⾏,并通过Nginx进⾏反向代理。
在梳理了系统各功能模块业务职责之后,我们决定先将数据模块试⽔:使⽤Golang进⾏改造,理由是数据模块功能较为简单,Golang只需计算逻辑然后向前端页⾯提供数据接⼝即可。同时借助Nginx的反向代理功能,将数据接⼝前缀的转发⾄Golang程序,其他所有请求还是依旧转发⾄原来的PHP-FPM程序。其抽象模型⼤致如下:
4、About Hot-Update
所谓热更新,是指在系统升级或修复bug过程中对⽤户来说是⽆感知的。
使⽤PHP开发时,开发者⽆需关⼼热更新,因为PHP是解释型的编程语⾔,PHP-FPM会根据最新的请求实时去调⽤执⾏具体某个PHP⽂件;⽽Golang则不同,它是编译型语⾔,在运⾏时会把Golang⽂件加载到内存,这时,所有对代码的改动想要更新必须要重启服务才能⽣效。那么如何在重启服务过程中,不影响当前⽤户请求,便是热更新需要解决的问题。
⽬前Golang热更新⼤致有两个思路:Plugin包(Golang1.8+,原理类似C++动态链接库⽅式)和第三⽅热更新库(如)Facebook开源的库以及库等。
关于第三⽅热更新库逻辑⼤致为:
发布变更的项⽬代码⽂件
发送变更通知给服务进程(信号⽅式,通常是USR2信号)
服务进程收到通知后,调⽤ fork/exec 启动最新项⽬代码(新进程)
⼦进程调⽤会从⽗进程继承 socket ⽂件描述符来重新监听 socket(此时⽗⼦进程同时Accept连接)
原有⽗进程不再接收新请求,待正在处理中的请求处理完后,进程⾃动退出(gracefully shutdown)
⼦进程托管给init进程
总结
以上⼤致接介绍了从PHP项⽬迁移到Golang所需的⼀些思想与技术上的准备,后续篇章将介绍具体技术⽅案与实现细节。References
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论