[精選] 為什麼要選擇Go語言作為PHP的黃金組合?而不是Java或Python

Weiwen發表於2022-09-14

Go語言主要用作伺服器端開發,其定位是用來開發“大型軟體”的,適用於很多程式設計師一起開發大型軟體,並且開發週期長,支援雲端計算的網路服務。Go語言能夠讓程式設計師快速開發,並且在軟體不斷的增長過程中,它能讓程式設計師更容易地進行維護和修改。它融合了傳統編譯型語言的高效性和指令碼語言的易用性和富於表達性。

Go語言作為伺服器程式語言,很適合處理日誌、資料打包、虛擬機器處理、檔案系統、分散式系統、資料庫代理等;網路程式設計方面,Go語言廣泛應用於Web應用、API應用、下載應用等;除此之外,Go語言還可用於記憶體資料庫和雲平臺領域,目前國外很多雲平臺都是採用Go開發。

對於高效能分散式系統領域而言,Go 語言無疑比大多數其它語言有著更高的開發效率。它提供了海量並行的支援,這對於遊戲服務端的開發而言是再好不過了。

GO語言是種什麼樣的語言

GO語言是種什麼樣的語言?它與微服務的結合會給PHP開發帶來怎麼樣的效能提高?PHP知識體系涉及普遍,若是想成為一名合格的PHP工程師,通往進階之路,則須要對這些知識點都要有所瞭解。

GO語言是一種靜態強型別、編譯型、併發型,並具備垃圾回收功能的程式語言。它存在的意義純粹是為了彌補其餘程式語言的痛點。

如PHP結合GO後,將會對效能大大提高。它加入了併發程式設計,其中涉及到大資料、微服務等概念,契合了大廠在招聘中的技術要求。

Go語言的特點在於使人簡易使用的並行設計,可以讓程式以非同步的方式執行,而不須要擔憂一個函式致使程式中斷,所以Go語言也很是地適合網路服務。

多數狀況下,PHP開發者們會使用nginx Web-server和 php-fpm伺服器組合執行應用程式。在執行PHP指令碼期間,狀態沒法更改,獲取一組新輸入資料的惟一方法是銷燬該程式並從新開始。

這樣使得PHP開發者們根本不用擔憂記憶體使用狀況,就算有些程式死亡也能自動建立而不影響其餘程式。可是在擴充套件應用程式時,這會給程式開發帶來極度困難,因此這也是PHP被吐槽的點之一。

GO語言的擴充套件性巧妙的解決了PHP在擴充套件應用程式時的問題,在軟體不斷的增加過程當中,讓PHP開發者更容易地進行維護和修改。

GO語言建立的應用伺服器,讓PHP適應於複雜的任務需求,既能夠接受HTTP請求,而又轉發給PHP工做者,最大化的保障每一個應用程式的擴充套件性和多樣性。PHP開發者也可使用GO語言所用擁有的數千個開源庫和整合環境。

當在PHP開發中用到GO語言,不只徹底消除了502錯誤的發生,並且將伺服器總數減小了近三分之二,節省了大量工做成本和伺服器成本。所以經過與Go語言等其餘語言配對,建立出的PHP語言成為眾多開發者選擇,PHP再也不被認為緩慢的語言,將來也將繼續在其中尋找更高效率的方法。

為什麼選擇GO語言

選擇GO語言,主要是基於兩方面的考慮

  1. 執行效能 縮短API的響應時長,解決批次請求訪問超時的問題。在Uwork的業務場景下,一次API批次請求,往往會涉及對另外介面服務的多次呼叫,而在之前的PHP實現模式下,要做到並行呼叫是非常困難的,序列處理卻不能從根本上提高處理效能。而GO語言不一樣,透過協程可以方便的實現API的並行處理,達到處理效率的最大化。 依賴Golang的高效能HTTP Server,提升系統吞吐能力,由PHP的數百級別提升到數千裡甚至過萬級別。

  2. 開發效率 GO語言使用起來簡單、程式碼描述效率高、編碼規範統一、上手快。 透過少量的程式碼,即可實現框架的標準化,並以統一的規範快速構建API業務邏輯。 能快速的構建各種通用元件和公共類庫,進一步提升開發效率,實現特定場景下的功能量產。

圖片

很多人在學習一門新語言或開啟一個新專案時,都會習慣性的是網上找一個認為合適的開源框架來開始自己的專案開發之旅。這樣並沒有什麼不好,但是個人覺得,瞭解它內部的實現對我們會更有幫助。

或許大家已經注意到了,所說的MVC框架,其本質上就是對請求路徑進行解析,然後根據請求路徑段,路由到相應的控制器(C)上,再由控制器進一步呼叫資料邏輯(M),拿到資料後,渲染檢視(V),返回使用者。在整個過程中,核心點在於邏輯的動態呼叫。

不過,對API框架的實現相對於WEB頁面框架的實現,會更簡單,因為它並不涉及檢視的渲染,只需要將資料結果以協議的方式返回給使用者即可。

使用GO語言實現一套完整的MVC開發框架,是非常容易的,整合HTTP Server的同時,整個框架的核心程式碼不會超過300行,從這裡可以實際感受到GO的語言描述效率之高(如果有興趣,可以參考Uwork開源專案seine)。

也有人說,在GO語言中,就沒有框架可言,言外之意是說,引入一個重型的開源框架,必要性並不大,相反還可能把簡單的東西複雜化。

圖片

在實際專案開發過程中,只有高效的開發語言還不夠,要想進一步將開發效率擴大化,不斷的沉澱公共基礎庫是必不可少的,以便將通用的基礎邏輯進一步抽象和複用。

除此之外,通用元件能力是實現功能量產的根本,對開發效率會是質的提升。元件化的開發模式會幫忙我們將問題的解決能力從一個點上提升到一個面上。

以下會重點介紹幾個通用元件的實現,有了它們的存在,才能真正的解放程式設計師的生產力。而這些強有力的公共元件在Golang中實現起來並不複雜。

同時,結合Golang的併發處理能力,相比於PHP的版本實現,執行效率也會有質的提升。這是元件能力和語言效率的完美結合。

圖片

通用列表元件用於所有可能的二維資料來源(如MySQL/MongoDB/ES等等)的資料查詢場景,從一個面上解決了資料查詢問題。

在Uwork專案開發中,被大量使用,實現資料查詢介面和頁面查詢列表的量產開發。它以一個JSON配置檔案為中心,來實現對通用資料來源的查詢,並將查詢結果以API或頁面的形式自動返回給使用者。

整個過程中幾乎沒有程式碼開發,而唯一要做的只是以一種統一的規範編寫配置檔案(而不是程式碼),真正實現了對資料查詢需求的功能量產。

圖片

以上是通用列表元件的構建過程,要實現這樣一個功能強大的通用元件,是不是會給人一種可望而不可及的感覺?其實並非如此,只要理清了它的整個過程,將構建思路融入Golang中,並不是一件複雜的事情。

透過Golang的併發特性,實現欄位處理器的並行執行,進一步的提高了元件的執行效率。可以說,通用列表和Golang的融合,是效能和效率的完美結合。

圖片

通用表單元件主要用於對資料庫的增、刪、改場景。該元件在Uwork的專案開發中,也有廣泛的應用,與通用列表類似,以一個JSON配置檔案為中心,來完成對資料表資料的增、刪、改操作。

特別是近期完成的部件級SDB管理平臺,透過通用表單實現了對整個系統的資料維護,透過高度抽象化,做到了業務的無程式碼化生產。

圖片

以上是通用表單的完整構建過程,而對於這個一個元件的實現,我們用了不到1000行的GO程式碼,就解決了對資料表資料維護整個面上的問題。

圖片

GO語言本身支援協程併發,協程非常輕量,可以快速啟動成千上萬個協程工作單元。如果對協程任務的數量控制不當,最後的結果很可能適得其反,從而對外部或本身的服務造成不必要的壓力。

協程池可以在一定程度上控制執行單元的數量,保證執行的安全性。而在Golang中要實現這樣一個協程池,是非常簡單的,只需要對channel和goroutine稍加封裝,就可以完成,整個構建過程不到80行程式碼。

圖片

在API開發過程中,資料校驗永遠是必不可或缺的一個環節。如果只是簡單的資料校驗,幾行程式碼也許就完成了,可是當遇上覆雜的資料校驗時,很可能幾百行的程式碼量也未必能完成,特別是遇到遞迴型別的資料校驗,那簡直就是一個噩夢。

資料校驗元件,可以透過一種資料模板的配置方式,使用特定的邏輯來完成通用校驗,開發者只需要配置好相應的資料模板,進行簡單的呼叫,即可完成整個校驗過程。而對於這樣一個通用性的資料校驗元件,在GO語言中只用了不到700行的程式碼量就完成了整個構建。

原文連結:www.zhihu.com/question/296426314

本作品採用《CC 協議》,轉載必須註明作者和本文連結
最美的不是下雨天,而是和你一起躲過的屋簷!

相關文章