当前位置: 首页 > 后端技术 > PHP

从PHP迁移到Golang-基础

时间:2023-03-29 15:29:43 PHP

1.WhyNotPHP用PHP构建的WEB程序,随着业务发展到一定规模,不得不面临以下问题:业务功能不断扩展,如何避免单一业务功能故障影响整体,保持系统健壮性。业务逻辑的复杂性在增加。如何解耦和模块化以降低系统复杂性。网站访问量不断增加。如何实现系统的高并发和高可用计算密集型业务的出现,如何快速适应需求,提升网站性能...对于PHP来说,在业务发展初期,业务原型可以快速实现满足需求,但是到了开发的中后期,就显得有点后劲不足了。因为PHP不擅长高并发、多进程/线程和密集型计算。这种情况在swoole出现后得到了极大的缓解。然而,随着微服务架构的兴起和容器时代的到来,这种情况再次激化。因为大部分的PHP需要使用Nginx和PHP-FPM或者类似的软件进行进程管理,这就意味着部署PHP项目代码必须同时包含PHP-FPM和Nginx用于部署微服务,这样不仅增加了资源成本还降低了效率。2.为什么选择Golang那么,为什么选择Golang?首先,Golang与PHP非常相似。它们都是类C语言,可以很好地进行“知识迁移”。其次,Golang在性能和开发效率之间取得了很好的平衡。该库功能强大且易于部署。最重要的是,Golang在微服务和容器领域有着良好的基础,后面的系统可以完美的实现微服务和容器。当然,即便如此,PHP仍然是世界上最好的语言。3.HowTo准备好之后,就可以开始建立技术方案了。任何大型系统的重构都不是一蹴而就的,它是瞬间发生的,需要循序渐进的过程。而且,在这个重构过程中,主要的前提必须是保持现有系统所有业务正常运行,所以需要建立的是对系统基本无损的子模块的逐步替换。回到我们现在的系统架构:在每台服务器上部署相同的PHP项目代码,由PHP-FPM统一解释执行,通过Nginx进行反向代理。在梳理了系统各个功能模块的业务职责后,我们决定先测试数据模块:使用Golang进行改造。原因是数据模块的功能比较简单。Golang只需要计算逻辑,然后提供数据接口给前端页面。同时借助Nginx的反向代理功能,将数据接口前缀转发给Golang程序,其他所有请求仍然转发给原来的PHP-FPM程序。其抽象模型大致如下:4、关于热更新所谓热更新,是指用户不知道系统升级或bug修复的过程。使用PHP开发时,开发者无需关心热更新,因为PHP是一种解释型编程语言,PHP-FPM会根据最新的请求实时调用并执行特定的PHP文件;Golang则不同,它是一种编译型语言,在运行时,Golang文件会被加载到内存中。此时,所有对代码的改动都必须重启才能生效。那么如何在重启服务的过程中不影响当前用户请求,就是热更新需要解决的问题。目前Golang热更新的思路大致有两种:插件包(Golang1.8+,原理类似C++动态链接库方法)和第三方热更新库(如)Facebook的开源grace库和endless图书馆。第三方热更新库的逻辑大致如下:发布变更的项目代码文件向服务进程发送变更通知(信号方式,一般为USR2信号)。服务进程收到通知后,调用fork/exec启动最新的项目代码(新进程)子进程调用会继承父进程的socket文件描述符,重新监听socket(此时父进程和子进程同时接受连接)。原来的父进程将不再接收新的请求。请求处理完成后,进程会自动退出(优雅的关闭)子进程由init进程托管。总结以上大致介绍了从PHP项目迁移到Golang所需要的一些思路和技术准备。后续章节将介绍具体的技术方案和实现细节。参考资料http://mikespook.com/2012/08/...https://github.com/facebookgo...https://github.com/fvbock/end...https://fitstar.github.io/错误...