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

2018年5月19日,在上海舉行的第六屆中國PHP開發者大會(PHPCon)上,騰訊開源項目TARS首次全面發佈PHP版本,閱文集團高級開發工程師梁晨對PHP如何經過TARS構建高性能RPC框架作了經驗分享。
php


分享內容:

TARS做爲騰訊開源的RPC框架,在發佈以後即受到開源領域的關注。它在微服務、協議、多語言和運營體系上的支持,都很是的完善。在微服務方面,實現了服務自動發現、智能調度、容災容錯、柔性熔斷,以及路由與灰度的功能。與此同時,經過使用私有二進制協議,能夠有效的下降服務之間調用的流量。而在語言支持的層面,TARS對C++、Java、Nodejs、PYTHON都提供了比較好的方案。考慮到PHP在WEB後臺領域的使用很是的普遍,TARS-PHP的出現,勢在必行。git

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

TARS-PHP的解決方案,按照功能模塊,會分紅如下四個部分:github

l TARS-CLIENTdocker

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:


能夠清晰的看到,統一化的配置,層級更爲清晰,並且調用者無需關心底層細節,尋址和主調上報已經悄然完成。

再從總體的角度來看一下TARS-CLIENT的方案:


從圖中能夠更爲清晰的看到底層實現的細節。對於自動尋址而言,實現自動並不徹底解決問題。由於每次都去詢問服務的地址,會給主控服務帶來很大的壓力。所以結合了PHP自己的能力以後,選用了SWOOLE TABLE和本地文件做爲緩存的方式。緩存時間由服務啓動時默認指定,那麼在這個時間以內,便不會再次進行主控的請求。下降了主控壓力的同時,也下降了本地獲取服務地址的耗時。

而以下圖所示:主調上報的策略中,也可以根據實際的網絡收發狀況,進行耗時、失敗率、超時率、服務端異常的及時上報,方便業務儘快發現和定位問題。


TARS-EXT擴展

在TARS-CLIENT的底層,包含不少二進制協議的打包解包工做。而這些字符串的拼接和拷貝的操做偏偏是PHP的弱項,所以很是有必要將其抽象出來,做爲獨立的PHP擴展模塊開發。

在現有擴展的體系中,主要包含了對高性能和穩定性兩方面的考慮。高性能方面,字符串操做徹底經過純C語言進行了實現。而同時經過合理設計接口,避免一次組包的屢次操做,從而進一步提升效率。

而在擴展的穩定性方面,經過引入phpt的擴展標準測試,以及Valgrind工具進行內存泄露測試。測試代碼覆蓋率達到了80%以上。同時每次進行內部版本代碼提交的時候,會自動觸發從PHP5.6~PHP7.2的主流版本自動構建測試,並在發生構建異常的時候,發送郵件。

下圖中能夠清晰的看到,相比於原有的使用純PHP打包解包的方式,使用擴展的方式,在簡單協議的狀況下,打包效率提高了16倍,解包效率提高了14倍。而在複雜協議的狀況下,一樣效率的提高也達到了12和9倍之多。


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,而且三個框架合一,只需簡單配置,便可順暢使用。


上圖中,能夠很清晰的看到強大的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的使用也很是方便,只需以下代碼:


時間能夠靈活控制,同時全部定時服務放在一塊兒也很是的方便管理。TIMER在服務啓動的時候,也會自動啓動,無需再次觸發。TIMER的數量,只受制於SWOOLE啓動時候的進程數量,開發者能夠靈活的調配。

對於開發者很是關心的服務性能,咱們也針對不一樣的接口、版本、CLIENT進行了壓測,結果以下:


從數據來看,仍是很是的使人滿意。空跑的HTTP SERVER QPS最高達到了23萬。而使用了協程CLIENT以後,在混合RPC調用的狀況下,仍有2萬1的QPS,相比於同步CLIENT,提高了50%左右。充分說明了協程CLIENT對於性能的提高做用明顯。

開發效率

在進行TARS-PHP設計的時候,一個必需要考慮的問題,就是開發效率。爲了遵循TARS自己的設計理念,TARS2PHP工具也進行了全新的升級,經過配置文件的方式,同時兼容了客戶端代碼和服務端代碼的生成,配置文件中會包含服務信息、TARS文件信息、命名空間信息等等:


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


由此,經過TARS文件、TARS2PHP工具,就可以徹底實現客戶端和服務端的代碼生成,而且兩端經過協議徹底解耦,大大提升了開發效率。

TARS-PHP在閱文

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

從下圖中能夠很是明顯的看到TARS與TARS-PHP在運維的使用狀況:


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

後續規劃

隨着TARS-PHP整套方案愈來愈成熟,但願更多的公司和開發者可以加入進來,共同建設。考慮到不一樣公司使用的框架並不相同,所以咱們的模塊化設計作得很是完全,在對SWOFT框架進行接入的過程當中,模塊化的方式體現了很是大的成效,只須要半天到一天的時間便可完成。後續TARS-PHP也會進一步豐富CLIENT能力,同時支持更多的現有框架,在提升穩定性的同時,對SERVER自己的功能豐富性,再作提高。TARS-PHP,等你來!


現場問答摘錄:


問:一箇中小型的公司如何使用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目錄內下載


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

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

相關文章
相關標籤/搜索