60

从PHP迁移至Golang - 基础篇

 5 years ago
source link: https://studygolang.com/articles/16322?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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还是世界上最好的语言。

3、How To

做好了思想上的准备之后,就可以开始确立技术方案了。

任何大型系统的重构都不可能是一蹴而就,顷刻之间发生的,需要一个循序渐进的过程。并且,在此重构过程中,大前提必须保持现有系统的所有业务照常运行,所以需要确立的是一个对系统基本无损的分模块逐步替换的方案。

回归到我们当前的系统架构:每台服务器上均部署相同的PHP项目代码,统一由PHP-FPM解释执行,并通过Nginx进行反向代理。

在梳理了系统各功能模块业务职责之后,我们决定先将数据模块试水:使用Golang进行改造,理由是数据模块功能较为简单,Golang只需计算逻辑然后向前端页面提供数据接口即可。同时借助Nginx的反向代理功能,将数据接口前缀的转发至Golang程序,其他所有请求还是依旧转发至原来的PHP-FPM程序。其抽象模型大致如下:

bVbjIL8?w=588&h=230

4、About Hot-Update

所谓 热更新 ,是指在系统升级或修复bug过程中对用户来说是无感知的。

使用PHP开发时,开发者无需关心热更新,因为PHP是解释型的编程语言,PHP-FPM会根据最新的请求实时去调用执行具体某个PHP文件;而Golang则不同,它是编译型语言,在运行时会把Golang文件加载到内存,这时,所有对代码的改动想要更新必须要重启服务才能生效。那么如何在重启服务过程中,不影响当前用户请求,便是热更新需要解决的问题。

目前Golang热更新大致有两个思路:Plugin包(Golang1.8+,原理类似C++动态链接库方式)和第三方热更新库(如)Facebook开源的 grace 库以及 endless 库等。

关于第三方热更新库逻辑大致为:

  • 发布变更的项目代码文件
  • 发送变更通知给服务进程(信号方式,通常是USR2信号)
  • 服务进程收到通知后,调用 fork/exec 启动最新项目代码(新进程)
  • 子进程调用会从父进程继承 socket 文件描述符来重新监听 socket(此时父子进程同时Accept连接)
  • 原有父进程不再接收新请求,待正在处理中的请求处理完后,进程自动退出(gracefully shutdown)
  • 子进程托管给init进程

总结

以上大致接介绍了从PHP项目迁移到Golang所需的一些思想与技术上的准备,后续篇章将介绍具体技术方案与实现细节。

References


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK