使用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...服務器