乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

騰訊開源發表於2019-02-28

2018年5月19日,在上海舉行的第六屆中國PHP開發者大會(PHPCon)上,騰訊開源專案TARS首次全面釋出PHP版本,閱文集團高階開發工程師樑晨對PHP如何通過TARS構建高效能RPC框架做了經驗分享。

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

分享內容:

TARS作為騰訊開源的RPC框架,在釋出之後即受到開源領域的關注。它在微服務、協議、多語言和運營體系上的支援,都非常的完善。在微服務方面,實現了服務自動發現、智慧排程、容災容錯、柔性熔斷,以及路由與灰度的功能。與此同時,通過使用私有二進位制協議,可以有效的降低服務之間呼叫的流量。而在語言支援的層面,TARS對C++、Java、Nodejs、PYTHON都提供了比較好的方案。考慮到PHP在WEB後臺領域的使用非常的廣泛,TARS-PHP的出現,勢在必行。

那麼在設計TARS-PHP的時候,必須考慮到現有PHP的開發生態,至少要做到 功能完善、靈活、輕量和高效。在功能方面,TARS-PHP對標了現有的C++、JAVA、NodeJS的功能體系,做到了對CLIENT能力和SERVER能力的支援。而在靈活方面,PHP一直是出類拔萃的,作為泛型指令碼語言,開發的過程,誰用誰知道。而在輕量設計方面,TARS-PHP遵循一個最簡化、輕量級、可插拔的設計想法,讓整個方案自成體系的同時,也能具備最大程度的可擴充套件性。最後,也是最重要的,高效。通過引入PHP業界優秀的SWOOLE框架,再結合SWOOLE2.0的協程能力,讓TARS-PHP插上協程的翅膀。

TARS-PHP的解決方案,按照功能模組,會分成以下四個部分:

l TARS-CLIENT

l TARS-EXT擴充套件

l TARS-SERVER

l 開發效率模組

TARS-CLIENT

對於熟悉TARS-PHP的同學來說,TARS-CLIENT的能力在半年前就已經開源,並提供使用了。本次TARS-PHP的重新設計,也對TARS-CLIENT現有的能力做了一個梳理。全新設計之後的TARS-CLIENT具備了配置統一化、一鍵呼叫、以及多種網路能力的特點。而在功能上,整合也更為豐富了,現有的TARS-CLIENT由如下的功能模組組成:

l 自動定址:CLIENT再也無需關係服務地址

l 主調上報:呼叫情況會預設進行主調上報,服務情況一覽無遺

l 遠端日誌:日誌可以寫入遠端服務,再落地,降低檔案IO的損耗

l 網路能力:SOCKET、SWOOLE同步、SWOOLE協程

全新設計後的TARS-CLIENT,既可以滿足後臺系統的SOCKET請求需求,也能夠滿足在SWOOLE中進行同步和協程的兩種呼叫需求,使用者只需要靈活的按照配置各取所需。同時,全新整合的自動定址、主調上報、遠端日誌功能,會讓使用者在使用的時候,更加的無感知,更加的順暢。
下面即是現有TARS-CLIENT的使用demo:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

可以清晰的看到,統一化的配置,層級更為清晰,而且呼叫者無需關心底層細節,定址和主調上報已經悄然完成。
再從整體的角度來看一下TARS-CLIENT的方案:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

從圖中可以更為清晰的看到底層實現的細節。對於自動定址而言,實現自動並不完全解決問題。因為每次都去詢問服務的地址,會給主控服務帶來很大的壓力。因此結合了PHP本身的能力之後,選用了SWOOLE TABLE和本地檔案作為快取的方式。快取時間由服務啟動時預設指定,那麼在這個時間之內,便不會再次進行主控的請求。降低了主控壓力的同時,也降低了本地獲取服務地址的耗時。
而如下圖所示:主調上報的策略中,也能夠根據實際的網路收發情況,進行耗時、失敗率、超時率、服務端異常的及時上報,方便業務儘快發現和定位問題。

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

TARS-EXT擴充套件

在TARS-CLIENT的底層,包含很多二進位制協議的打包解包工作。而這些字串的拼接和拷貝的操作恰恰是PHP的弱項,因此非常有必要將其抽象出來,作為獨立的PHP擴充套件模組開發。
在現有擴充套件的體系中,主要包含了對高效能和穩定性兩方面的考慮。高效能方面,字串操作完全通過純C語言進行了實現。而同時通過合理設計介面,避免一次組包的多次操作,從而進一步提高效率。
而在擴充套件的穩定性方面,通過引入phpt的擴充套件標準測試,以及Valgrind工具進行記憶體洩露測試。測試程式碼覆蓋率達到了80%以上。同時每次進行內部版本程式碼提交的時候,會自動觸發從PHP5.6~PHP7.2的主流版本自動構建測試,並在發生構建異常的時候,傳送郵件。
下圖中可以清晰的看到,相比於原有的使用純PHP打包解包的方式,使用擴充套件的方式,在簡單協議的情況下,打包效率提升了16倍,解包效率提升了14倍。而在複雜協議的情況下,同樣效率的提升也達到了12和9倍之多。

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

TARS-SERVER

PHP作為SERVER走過了一段相對比較曲折的道路。最早時候,PHP是作為Apache的一個模組,來提供HTTP-SERVER的服務的。後來在Nginx越來越盛行的情況下,PHP_FPM應運而生。它比Apache的預先申請所有程式的方式稍好一些,但是仍然受制於程式資源和接受請求的能力,因此效率並不是很高。在這種大背景之下,SWOOLE應運而生,它基於多程式的模型,常駐記憶體並且使用epoll的事件驅動模型來處理收到的請求。因此在IO能力上甩之前的解決方案好幾條街。而在去年,SWOOLE2.0的出現,內建協程,同步程式設計的同時享受非同步IO,更是如虎添翼。

基於此,TARS-SERVER的解決方案也會以SWOOLE作為底層的執行環境,開發出了TARS-HTTP-SERVER、TARS-TIMER-SERVER和TARS-TCP-SERVER,並且三個框架合一,只需簡單配置,即可順暢使用。

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

上圖中,可以很清晰的看到強大的TARS-SERVER能力。除了提供最底層的三種基本SERVER型別之外。我們還提供了TARS-UTILS用來處理配置檔案解析,TARS-Report用來進行服務保活的定時上報,TARS-Config用來拉取平臺下發的配置,TARS-Property用來進行特性上報,以及TARS-Deploy模組進行業務程式碼的打包。這一整套的體系,使得TARS-SERVER的使用者既能夠實現自己的業務邏輯,也能夠針對性的進行擴充。可謂一舉兩得。
總的來看,我們的TARS-SERVER,基於SWOOLE 1.x和2.x,同時能夠很順暢的支援靈活的配置,如SWOOLE的配置和使用者自己的配置。除此之外,TARS-SERVER通過自動生成的註解進行請求的路由,開發者完全不需要關心,只需要關注於實現自己的業務邏輯即可。而另一方面,TARS-SERVER還額外提供了一個管理埠,用來接收平臺下發的指令,如SHUTDOWN、配置下發等等。

TARS-HTTP-SERVER為了滿足邏輯層服務的需求,進行了專門設計。一期中包括了GET/POST基本支援、Cookie/Status標準支援、極簡的路由元件實現、FILE上傳功能模組以及服務可用探測介面模組。

而TARS-TIMER-SERVER的使用也非常方便,只需如下程式碼:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

時間可以靈活控制,同時所有定時服務放在一起也非常的方便管理。TIMER在服務啟動的時候,也會自動啟動,無需再次觸發。TIMER的數量,只受制於SWOOLE啟動時候的程式數量,開發者可以靈活的調配。
對於開發者非常關心的服務效能,我們也針對不同的介面、版本、CLIENT進行了壓測,結果如下:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

從資料來看,還是非常的令人滿意。空跑的HTTP SERVER QPS最高達到了23萬。而使用了協程CLIENT之後,在混合RPC呼叫的情況下,仍有2萬1的QPS,相比於同步CLIENT,提升了50%左右。充分說明了協程CLIENT對於效能的提升作用明顯。

開發效率

在進行TARS-PHP設計的時候,一個必須要考慮的問題,就是開發效率。為了遵循TARS本身的設計理念,TARS2PHP工具也進行了全新的升級,通過配置檔案的方式,同時相容了客戶端程式碼和服務端程式碼的生成,配置檔案中會包含服務資訊、TARS檔案資訊、名稱空間資訊等等:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

從下圖中,能夠更加明顯的看到整個開發的路徑:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

由此,通過TARS檔案、TARS2PHP工具,就能夠完全實現客戶端和服務端的程式碼生成,並且兩端通過協議完全解耦,大大提高了開發效率。

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

TARS-PHP在閱文

TARS-PHP在閱文經過了一年多的驗證和使用,也逐步趨向成熟,越來越多的業務開始瞭解和使用TARS-PHP這套方案,併為他們在實際的開發和運維中帶來了收益。

從下圖中可以非常明顯的看到TARS與TARS-PHP在運維的使用情況:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

模板拼接的Node HTTP服務有10+,邏輯API層PHP服務與定時服務 40+,後臺TCP服務100+,每日之間億級呼叫。

後續規劃

隨著TARS-PHP整套方案越來越成熟,希望更多的公司和開發者能夠加入進來,共同建設。考慮到不同公司使用的框架並不相同,因此我們的模組化設計做得非常徹底,在對SWOFT框架進行接入的過程中,模組化的方式體現了非常大的成效,只需要半天到一天的時間即可完成。後續TARS-PHP也會進一步豐富CLIENT能力,同時支援更多的現有框架,在提高穩定性的同時,對SERVER本身的功能豐富性,再做提升。TARS-PHP,等你來!

現場問答摘錄:

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

問:一箇中小型的公司如何使用TARS
答:其實tars本身並不是非常的重量級,它主要是包含了一個一體化的運維繫統,以及專注於業務開發的一個rpc體系。閱文集團本身也有一塊新的業務在使用TARS。專案的機器規模也只是在幾十臺機左右,所以對於中小企業的公司來說,TARS也是一個可行的方案。

問:搭建一個TARS平臺成本比較高 如何解決這個問題
答:我們看到dockerhub 上面已經有了開發者 熱情的開發者,做出了一套包含環境的Docker容器,我們會考慮功能是否完善,把它合進來或者是製作官方的映象,這樣使用者在執行的時候就會非常方便了。

問:TARS-PHP對於不同通訊和二進位制協議本身的支援怎麼樣
答:現在TARS-PHP TCP服務支援的協議,僅限於TARS二進位制協議本身 但同時我們也提供了一些配置方式和介面,供大家實現自己的協議。而使用HTTP SERVER的話,協議都是可以自己選擇的,比如JSON等等。

問:對於將已有PHP+Swoole1.x的專案遷移至TARS上,需要注意什麼問題以及有沒有比較合適的解決方案

答:閱文集團之前也是各個PHP專案分別獨立部署在伺服器上,沒有接入TARS平臺,但在去年經過1個月左右的改造已經全部遷移至TARS平臺,將已有專案遷移至TARS平臺除了需要對專案做一些必要的改造之外還需要保證後端TCP服務也已經接入TARS,遷移可能會有一些成本,但是之後便能享受到TARS平臺帶來的一系列的紅利。

PPT下載:

https://github.com/Tencent/Tars/tree/phptars php目錄內下載

乾貨| PHPCon上TARS-PHP全面解讀及PPT下載

對TARS使用還有任何問題,歡迎加入QQ交流群:

TARS交流群: 群號669339903 TARS-PHP交流群:群號:769531734

相關文章