摘要:但是,隨著微服務(wù)架構(gòu)的興起以及容器時代的到來,這種情況又再次加劇。最重要的是,在微服務(wù)與容器領(lǐng)域有很好的基礎(chǔ),后期系統(tǒng)可完美實(shí)現(xiàn)微服務(wù)化與容器化。
1、Why Not PHP
使用PHP構(gòu)建的WEB程序,隨著業(yè)務(wù)發(fā)展到一定體量之后,都不得不面臨以下一些問題:
業(yè)務(wù)功能不斷擴(kuò)張,如何避免某單一業(yè)務(wù)功能故障影響整體,維持系統(tǒng)健壯性
業(yè)務(wù)邏輯復(fù)雜度不斷上升,如何解耦與模塊化,降低系統(tǒng)復(fù)雜性
網(wǎng)站訪問量不斷攀升,如何實(shí)現(xiàn)高并發(fā),實(shí)現(xiàn)系統(tǒng)高可用性
計算密集型業(yè)務(wù)的出現(xiàn),如何快速適應(yīng)需求,提升網(wǎng)站性能
...
對于PHP而言,在業(yè)務(wù)發(fā)展初期,可以快速實(shí)現(xiàn)業(yè)務(wù)原型,滿足需求,但是在發(fā)展的中后期就顯得略有點(diǎn)后勁不足。
因?yàn)镻HP在高并發(fā)、多進(jìn)程/線程以及密集計算領(lǐng)域并不擅長。這種情況在swoole出現(xiàn)之后得到了很大的緩和。
但是,隨著微服務(wù)架構(gòu)的興起以及容器時代的到來,這種情況又再次加劇。因?yàn)镻HP大都需要借助Nginx和PHP-FPM或類似軟件來進(jìn)行進(jìn)程管理,這對于部署的微服務(wù)意味著部署PHP項目代碼的同時必須同時包括PHP-FPM和Nginx,這除了增加資源成本也降低了效率。
那么,為什么是Golang呢?
首先,Golang與PHP很像,都是類C語言,可以很好的進(jìn)行『知識遷移』
其次,Golang在性能和開發(fā)效率上有很好的平衡,語法簡單,語言層面上支持并發(fā)編程,且基礎(chǔ)庫健全,部署容易。
最重要的是,Golang在微服務(wù)與容器領(lǐng)域有很好的基礎(chǔ),后期系統(tǒng)可完美實(shí)現(xiàn)微服務(wù)化與容器化。
當(dāng)然了,即便如此,PHP還是世界上最好的語言。
3、How To做好了思想上的準(zhǔn)備之后,就可以開始確立技術(shù)方案了。
任何大型系統(tǒng)的重構(gòu)都不可能是一蹴而就,頃刻之間發(fā)生的,需要一個循序漸進(jìn)的過程。并且,在此重構(gòu)過程中,大前提必須保持現(xiàn)有系統(tǒng)的所有業(yè)務(wù)照常運(yùn)行,所以需要確立的是一個對系統(tǒng)基本無損的分模塊逐步替換的方案。
回歸到我們當(dāng)前的系統(tǒng)架構(gòu):每臺服務(wù)器上均部署相同的PHP項目代碼,統(tǒng)一由PHP-FPM解釋執(zhí)行,并通過Nginx進(jìn)行反向代理。
在梳理了系統(tǒng)各功能模塊業(yè)務(wù)職責(zé)之后,我們決定先將數(shù)據(jù)模塊試水:使用Golang進(jìn)行改造,理由是數(shù)據(jù)模塊功能較為簡單,Golang只需計算邏輯然后向前端頁面提供數(shù)據(jù)接口即可。同時借助Nginx的反向代理功能,將數(shù)據(jù)接口前綴的轉(zhuǎn)發(fā)至Golang程序,其他所有請求還是依舊轉(zhuǎn)發(fā)至原來的PHP-FPM程序。其抽象模型大致如下:
所謂熱更新,是指在系統(tǒng)升級或修復(fù)bug過程中對用戶來說是無感知的。
使用PHP開發(fā)時,開發(fā)者無需關(guān)心熱更新,因?yàn)镻HP是解釋型的編程語言,PHP-FPM會根據(jù)最新的請求實(shí)時去調(diào)用執(zhí)行具體某個PHP文件;而Golang則不同,它是編譯型語言,在運(yùn)行時會把Golang文件加載到內(nèi)存,這時,所有對代碼的改動想要更新必須要重啟服務(wù)才能生效。那么如何在重啟服務(wù)過程中,不影響當(dāng)前用戶請求,便是熱更新需要解決的問題。
目前Golang熱更新大致有兩個思路:Plugin包(Golang1.8+,原理類似C++動態(tài)鏈接庫方式)和第三方熱更新庫(如)Facebook開源的grace庫以及endless庫等。
關(guān)于第三方熱更新庫邏輯大致為:
發(fā)布變更的項目代碼文件
發(fā)送變更通知給服務(wù)進(jìn)程(信號方式,通常是USR2信號)
服務(wù)進(jìn)程收到通知后,調(diào)用 fork/exec 啟動最新項目代碼(新進(jìn)程)
子進(jìn)程調(diào)用會從父進(jìn)程繼承 socket 文件描述符來重新監(jiān)聽 socket(此時父子進(jìn)程同時Accept連接)
原有父進(jìn)程不再接收新請求,待正在處理中的請求處理完后,進(jìn)程自動退出(gracefully shutdown)
子進(jìn)程托管給init進(jìn)程
總結(jié)以上大致接介紹了從PHP項目遷移到Golang所需的一些思想與技術(shù)上的準(zhǔn)備,后續(xù)篇章將介紹具體技術(shù)方案與實(shí)現(xiàn)細(xì)節(jié)。
Referenceshttp://mikespook.com/2012/08/...
https://github.com/facebookgo...
https://github.com/fvbock/end...
https://fitstar.github.io/fal...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/29651.html
摘要:上篇大致提到的的熱更新,本篇將詳細(xì)論述。軟件的熱更新就是指在保持系統(tǒng)正常運(yùn)行的情況下對系統(tǒng)進(jìn)行更新升級。同樣地,熱更新也可以采取類似的處理。注包方式的熱更新本文暫不討論。 上篇大致提到的Golang的熱更新,本篇將詳細(xì)論述。 1、什么是熱更新 網(wǎng)絡(luò)上有這么一個例子來形容熱更新,我覺得很形象很貼切: 一架行駛在高速上的大卡車,行駛過程中突然遭遇爆胎,熱更新則是要求在不停車的情況下將車胎修...
摘要:如果你只對開發(fā)者需要了解的事感興趣,請下拉到早該知道的事板塊。在不泄露機(jī)密的情況下,利用支持向量機(jī)來獲取一個句子最可能的意思,并且以此來推斷句子的情感。也就是說,如果一個文檔包含個詞,就會與支持向量機(jī)進(jìn)行多次對比。 【編者按】本文最早由 Repustate 發(fā)布,主要介紹將代碼遷移至 Go(lang) 時的注意事項。文章系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn),以下為正文。 ...
摘要:的本質(zhì)是團(tuán)隊博客,關(guān)注互聯(lián)網(wǎng)創(chuàng)業(yè)技術(shù),每周推薦篇優(yōu)質(zhì)文章。堅持爭取做到每周更新,與讀者一起進(jìn)步。第十一期第十期第九期第八期第七期第六期第五期第四期第三期切換至,第二期發(fā)布。創(chuàng)刊,用發(fā)布了第一次。 Tuniu Weekly Inspired By 《灣區(qū)日報》 我們團(tuán)隊也想基于這種模式,讓大家感受到技術(shù)的人文。 《Tuniu Weekly》就這樣產(chǎn)生了。 《Tuniu Weekly》...
摘要:多圖上傳修改里面的方法將封面修改為封面創(chuàng)建圖片修改器修改器使用說明,請閱讀相關(guān)說明文檔在里增加和兩個方法顯示效果原文地址地址 laravel中使用WangEditor及多圖上傳 1. 創(chuàng)建項目及安裝所需安裝包 1.1 創(chuàng)建項目 composer create-project laravel/laravel=5.3 blog_wangeditor --prefer-dist 1.2 創(chuàng)建...
摘要:多圖上傳修改里面的方法將封面修改為封面創(chuàng)建圖片修改器修改器使用說明,請閱讀相關(guān)說明文檔在里增加和兩個方法顯示效果原文地址地址 laravel中使用WangEditor及多圖上傳 1. 創(chuàng)建項目及安裝所需安裝包 1.1 創(chuàng)建項目 composer create-project laravel/laravel=5.3 blog_wangeditor --prefer-dist 1.2 創(chuàng)建...
閱讀 2996·2021-09-10 10:50
閱讀 3195·2019-08-30 14:19
閱讀 3525·2019-08-29 17:31
閱讀 3256·2019-08-29 16:43
閱讀 2199·2019-08-29 14:05
閱讀 2097·2019-08-29 13:17
閱讀 2053·2019-08-26 13:25
閱讀 1770·2019-08-26 12:20