使用PHP构建的WEB程序,随着业务发展到必定体量以后,都不得不面临如下一些问题:php
对于PHP而言,在业务发展初期,能够快速实现业务原型,知足需求,可是在发展的中后期就显得略有点后劲不足。
由于PHP在高并发、多进程/线程以及密集计算领域并不擅长。这种状况在swoole出现以后获得了很大的缓和。
可是,随着微服务架构的兴起以及容器时代的到来,这种状况又再次加重。由于PHP大都须要借助Nginx和PHP-FPM或相似软件来进行进程管理,这对于部署的微服务意味着部署PHP项目代码的同时必须同时包括PHP-FPM和Nginx,这除了增长资源成本也下降了效率。html
那么,为何是Golang呢?前端
固然了,即使如此,PHP仍是世界上最好的语言。git
作好了思想上的准备以后,就能够开始确立技术方案了。
任何大型系统的重构都不多是一蹴而就,顷刻之间发生的,须要一个按部就班的过程。而且,在此重构过程当中,大前提必须保持现有系统的全部业务照常运行,因此须要确立的是一个对系统基本无损的分模块逐步替换的方案。
回归到咱们当前的系统架构:每台服务器上均部署相同的PHP项目代码,统一由PHP-FPM解释执行,并经过Nginx进行反向代理。
在梳理了系统各功能模块业务职责以后,咱们决定先将数据模块试水:使用Golang进行改造,理由是数据模块功能较为简单,Golang只需计算逻辑而后向前端页面提供数据接口便可。同时借助Nginx的反向代理功能,将数据接口前缀的转发至Golang程序,其余全部请求仍是依旧转发至原来的PHP-FPM程序。其抽象模型大体以下:github
所谓热更新,是指在系统升级或修复bug过程当中对用户来讲是无感知的。
使用PHP开发时,开发者无需关心热更新,由于PHP是解释型的编程语言,PHP-FPM会根据最新的请求实时去调用执行具体某个PHP文件;而Golang则不一样,它是编译型语言,在运行时会把Golang文件加载到内存,这时,全部对代码的改动想要更新必需要重启服务才能生效。那么如何在重启服务过程当中,不影响当前用户请求,即是热更新须要解决的问题。
目前Golang热更新大体有两个思路:Plugin包(Golang1.8+,原理相似C++动态连接库方式)和第三方热更新库(如)Facebook开源的grace库以及endless库等。
关于第三方热更新库逻辑大体为:golang
以上大体接介绍了从PHP项目迁移到Golang所需的一些思想与技术上的准备,后续篇章将介绍具体技术方案与实现细节。编程
http://mikespook.com/2012/08/...
https://github.com/facebookgo...
https://github.com/fvbock/end...
https://fitstar.github.io/fal...服务器