1. 程式人生 > >TARS 斬獲 2018 年最佳原創開源軟體獎

TARS 斬獲 2018 年最佳原創開源軟體獎

  

最近在開源中國舉辦的開源年終盛典上,開源專案 TARS 獲得了年度最佳原創開源軟體獎

談到微服務,人們往往會提起Spring Cloud和Service Mesh。

目前帶服務治理的微服務框架中,Spring Cloud對JAVA開發者在微服務系統開發過程的各個環節不斷豐富,使其在JAVA開發領域有廣泛的應用。

另外,近年Service Mesh 作為後起之秀,也得到了較為廣泛的關注。它在 Sidecar 的基礎上,強調了各個代理之間形成的有機網路,可以做到語言無關、功能可擴充套件,目前社群處於發展階段。

Spring Cloud 與 Service Mesh 這兩種模式,一個作為JAVA開發領域的翹楚,一個被譽為開啟下一代微服務架構的基礎,那麼 TARS 的突破口在哪裡?又何以戴上“最佳原創”的皇冠?筆者深挖了 TARS 這個專案開源以來的一些資訊,並採訪了專案相關負責人,整理出此文供讀者參考。

據悉,TARS是騰訊去年 4 月份開源的一款微服務框架,它集可擴充套件協議編解碼、高效能 RPC 通訊框架、名字路由與發現、釋出監控、日誌統計、配置管理等於一體,是涉及到微服務架構系統開發和運維的一整套解決方案。

服務治理能力與多語言支援

Spring Cloud的各種服務治理功能能夠滿足系統的大多數需求,而且它們都在不斷完善,甚至於近期 Hystrix 都表示已經足夠穩定,而不再開發新功能了,但是僅支援單一語言把使用群體限定在了 Java 之上。

雖然單語言架構能應對大多應用場景,但在效能方面不得不說還是 C++ 與 Go 等語言比較有優勢。另一方面,在團隊與系統中,不同語言之間的通訊協同是一件十分麻煩的事情,如果原生提供多語言適配,那麼能夠為開發者省去不少時間與精力,讓他們可以專注在業務功能的實現上。隨著業務和使用者規模的擴大,為了應對快速的業務迭代與海量服務的開發與治理,結合 Java 與 C++ 或者其它各類語言的組合,將會帶來更高的收益。

而 Service Mesh,像前面說到的,它統一控制住了系統中所有服務的通訊流量,也就可以很容易地進行一系列服務治理,以 Istio 為代表的一系列 Service Mesh 框架也在不斷演進其服務治理能力。另一方面,通過 Sidecar 模式,Service Mesh 天然就可以實現框架對多語言的支援。但是這樣一來,業務需要再封裝一套通訊元件去解決通訊問題,並且還存在非同步呼叫等問題,同時會增加架構和維護的複雜度。而且由於 Service Mesh 目前還處在早期發展階段, Istio 釋出 1.0 版本僅幾個月,相關實踐還有待挖掘。

筆者從 TARS 社群瞭解到,它是目前區別於前兩者的具有服務治理能力並支援多語言

的微服務框架。

具體來講,TARS 的服務治理除了涉及到服務註冊、發現、負載均衡、熔斷、容災容錯等業界常說的能力之外,還提供面對海量訪問的一些特殊的治理能力,如 Set 模型、自動區域感知、過載保護等。

而它的多語言支援在一次次完善中不斷壯大著整個 TARS 生態:

C++、Java

TARS 於 17 年 4 月 10 日開源,最初的版本支援了 C++ 與 Java

TARS 的前身是騰訊從 08 年開始研發的後臺邏輯層統一應用框架 TAF(Total Application Framework),由於已經在內部研發了十年之久,這個版本的 TARS 已經實現了前邊提到的豐富的功能。它來得雖然晚,但是能力上並沒有要落後的意思。直到今天,騰訊內部各大核心業務都在使用 TARS ,基於該框架部署執行的服務節點規模達到十萬個,服務著騰訊數百個產品,包括手機 QQ、手機瀏覽器、應用寶、手機管家、地圖、遊戲、智慧產品等。而TARS一開源,僅在 4 天內就有超過1000個Star,之後閱文集團、虎牙直播、科大訊飛、大唐移動等50多家公司企業陸續採用它進行微服務架構系統的開發。

PHP

17 年 9 月 4 日,支援PHP 語言的TARS-PHP 釋出。

TARS-PHP 主要帶來了通訊協議設計上的改進,使開發者既可以使用二進位制的 TARS 協議,大大壓縮服務請求的流量,也能夠藉助 TARS 協議解析的 PHP 擴充套件,提高打包解包的效能,進而提升單程序的任務處理能力。

TARS-PHP 版本的客戶端選擇了使用PHP擴充套件的方式實現了對 TUP 協議的支援,TUP 協議是在 TARS 協議之上的協議,它通過固定的資料結構封裝收發包必須的資訊,如返回值、輸入輸出引數、包本身的狀態、包計數等,使得非 TARS 原生客戶端可以與 TARS 服務端進行通訊。

概括起來,TARS-PHP 的解決方案兼具簡單高效、介面維護方便、易於擴充套件、程式碼自動生成等特點,集成了定址、服務發現、監控、上報等功能,並且通過引入擴充套件,做到了效能的大幅度提升。

閱文集團在微服務層使用PHP、JAVA做了一些TARS的TCP微服務,它與HTTP的互動是基於TCP非同步加協程的方案。從實際資料來看,目前模板拼接的Node HTTP服務大概有十多個,邏輯API層PHP服務與定時服務有40多個,後臺TCP服務有100多個,每個呼叫是億級以上。

Node.js

支援Node.js語言的Tars.js 於 17 年 9 月 4 日 釋出。它的設計理念是:

  • 高自由度,開發者可以使用諸如 Express.js、Koa.js 等任何熟悉的框架,也無需對框架進行任何修改,即可通過 Tars.js 執行,享受平臺提供的各種監控與管理特性。同時,Tars.js 所提供的模組,也可以根據開發者的需求引入。

  • 高效能,使用了大量的前端(V8)優化技巧,儘量降低所提供的能力對於業務效能的影響,經測試,其預設的旁路上報與監控對服務效能的影響 ≤ 5%,常用模組(RPC、日誌等)效能位於業界前列。

  • 差異化,根據不同的業務型別提供差異化運營方案,針對高流量業務,盡力降低框架對業務效能的影響,而對於低流量業務,則充分利用硬體資源提升開發體驗。

Go

18 年 9 月 15 日,TARS 支援 Go語言。

Go 語言的協程併發機制使它非常適用於大規模高併發後端伺服器程式開發,同時隨著容器化技術的飛速發展,諸如 Docker、Kubernetes 與 Etcd 等專案興起,使得 Go 語言越來越流行,併成為雲原生的首選語言,TARS 的 Go 語言版本也因此應運而生。

一方面,TarsGo 的推出,在大環境整體逐漸走向雲原生的當下意義非凡,為開發者帶來了適應新時代需求的一種有效選擇。同時,Go 帶來的天然優勢,加上團隊對於 TarsGo 效能上的不斷優化,讓其在效能上取得了巨大的飛躍,在對 TarsGo 進行效能測試時,結果顯示其小包併發效能比 gRPC 高出5 倍。

高效能協議祕訣

TARS 作為一套 RPC 通訊領域的框架,其對相關協議進行了一系列優化與設計。

Spring Cloud 通常採用 HTTP + JSON 的 REST 介面對外提供服務,而由於 HTTP 協議本身固有的特點,使得它不能併發處理網路請求,而且響應請求的時候還依賴於請求的先後順序,這使得高併發、並行處理請求的場景下必須建立大量的連線,而連線的建立、維持和銷燬都會消耗 CPU 和記憶體資源。

此外,HTTP + JSON 還存在傳輸包較大、序列化與反序列化效率不高、服務連鎖反應導致的不穩定性等問題。

TARS 自研並在框架中主打了一種基於 IDL 實現的協議——TARS 協議,它以更加高效的方式解決了這些問題。這是一種二進位制解析協議,與 Protocol Buffer 類似,它與語言無關,是一種類 C++ 識別符號的語言,用於生成具體的服務介面檔案。

首先 TARS 協議是一種二進位制協議,相較於常見的 JSON 等文字協議,它的編解碼效率更高、網路包占用空間更小。

TARS 提供了非同步長連線的 RPC 呼叫方式,這主要是通過兩個部分的非同步來實現的,首先是網路首發包的非同步,TARS 的網路層實現採用了 Reactor 模型,通過 nio 提供的事件 IO 實現基於事件的非同步網路 IO。其次是執行緒模型的非同步,首先主調執行緒發起非同步呼叫,主調執行緒將請求內容加入網路執行緒池的傳送佇列中,之後該執行緒繼續執行。網路執行緒池使用 Reactor 模型實現,通過 nio 提供的 Selecter 實現事件 IO,所以所有網路執行緒均是事件驅動的非同步 IO,當監聽到對應連線的寫事件後將請求傳送,等待監聽到讀事件後讀取響應並交給回撥執行緒處理響應。

每個 TARS 協議請求帶有一個請求 id,通過同一個連線傳送的多個請求可以通過 id 來匹配響應,從而避免執行緒阻塞,降低硬體資源消耗。通常情況下一個客戶端和一個服務端之間僅使用幾個連線就可以滿足傳輸的要求。

TARS 協議採用 .tars 檔案定義介面和資料介面,TARS 檔案是 TARS 框架中客戶端與服務端的通訊介面,可對映實現遠端物件呼叫,通過提供的工具可以將資料和介面定義翻譯成各種語言的程式碼實現。介面的共享只需提供介面的定義檔案,使用者通過定義檔案直接生成客戶端介面程式碼即可。這樣減少了雙方的溝通成本,不再需要寫大量的介面定義文件與解析 JSON 所需的物件。

關於協議,2017 年 11 月 16 日,TARS 還將 Protobuf 協議引入,開源了 TARS-PB。為了減少對 PB 序列化和反序列化的侵入,TARS對物件仍然採用 PB 原生的生成方式,同時利用Protoc外掛機制來實現TARS-PB程式碼的生成。TARS-PB 的釋出,讓已經使用 Protobuf 作為內部資料交換協議的使用者可以更方便地對 TARS 進行整合。

開源之路

TARS 團隊認為開源應該保持初心,這是其開源態度。

採訪中,TARS開源專案負責人單致豪介紹:“我們開源的初心是貢獻,我們希望幫助開發者敏捷構建穩定可靠的微服務,幫助運維享受的高效運營平臺,幫助企業得到開箱即用的高效能生產級產品。” TARS-PHP負責人樑晨說:“從瞭解TARS, 到閱文集團微服務改造使用, 再到為TARS開源貢獻自己的一份程式碼, 點滴積累,希望能夠回饋社群,讓更多的開發者和公司受益!”Linux基金會亞太區負責人Keith Chan表示:“TARS已經成為Linux基金會重要的開源專案,我們希望專案能在基金會中健康成長,TARS的開源初心正是Linux基金會開源初心的表現。Linux基金會會持續幫助和支援專案發展,讓世界越來越多的開源愛好者能瞭解並使用,同時基於TARS開發出更優秀的開源專案。”

這樣的初心體現在以下幾個細緻的方面:

文件服務於社群

一直以來,騰訊開發者文件經常被吐槽寫得像那啥,而在對待 TARS 的時候,開源團隊為此做了大量考慮。團隊介紹,在 TARS 開源前,團隊瞭解了公司內部和開源社群在專案管理、程式碼維護、文件書寫等各方面的差異,並對專案做出修改,以保證開源後向社群的風格靠齊,具體包括:

  • 按照社群的習慣對 TARS 程式碼的組織結構進行調整,將內部原來分開維護的各個語言的框架程式碼統一在 Git 上進行管理,文件全部採用 Markdown 書寫;

  • 對 TARS 所有程式碼的編碼和註釋風格進行規範,讓使用者閱讀程式碼更加簡潔明瞭;

  • 對 TARS 所有程式碼檔案、配置檔案、DB檔案的字符集編碼採用 UTF-8 進行標準化;

  • 對 TARS 框架編譯安裝的方式與社群常用的方式對齊,採用符合社群習慣的 cmake 方式。

糾結於開源協議

社群常用的開源協議有 GPL、Apache、BSD 與 MIT 等,它們有各自的約束和規範。比如 GPL 有傳染性,它嚴格要求使用了採用 GPL 協議的類庫的軟體產品必須同樣使用 GPL 協議,所以使用 GPL 協議的開原始碼,一般不適合用於商業軟體或者對程式碼有保密要求的專案。而像 MIT 協議就特別寬鬆,甚至可以將基於 MIT 協議的原始碼商品化。

TARS 是一個比較龐大的框架,涉及到前臺、後臺等方面的技術,這其中依賴了一些第三方開源軟體,而這些第三方的開源軟體採用的開源協議並不相同,包括前邊說到的嚴格的 GPL。

於是團隊糾結於將 TARS 開源要採用什麼協議的問題。按照當時的情況,如果只是想要趕時間快點把 TARS 開源出去,那麼就可以不對專案做大面積的修改,但是這樣的話就必須選擇 GPL 協議。問題是選擇 GPL 協議將很難受到社群使用者的認同和商業化使用者的青睞。

這時候團隊表示他們堅定了開源初心,希望讓 TARS 使用更友好的開源協議,最終選擇 BSD-3-Clause,以核心元件為基礎,以不依賴開源協議為 GPL 的開源軟體為目標,對其中的工具或者元件程式碼重新開發測試。

以開源反哺行業

我們從 TARS 團隊處瞭解到了專案當前的具體情況。自17 年 4 月份開源後 TARS 便同步建立 TARS 開源社群。在這一年多的時間裡,TARS 陸續收穫了上千位個人開發者使用者,關注並使用 TARS 的企業有五十餘家,其中包括遊戲、直播平臺與網路通訊等行業。目前已建有 TARS 技術交流群十餘個。同時,TARS 與外部的開源社群保持緊密聯絡,就2018年,參加了20餘次公開技術大會與企業內訓。

今年 6 月份,TARS 進入 Linux 基金會,這是對其開源發展的肯定,在 Linux 基金會的帶動下,TARS 將有機會獲得包括開發與運營在內的各方面資源,為其發展提供助力。而除此之外,TARS 還積極參與到業界相關標準的探討中,以各種形式去帶動行業的發展。

今年 8 月 14 日,由中國信通院發起,騰訊深度參與制定的行業首個微服務平臺標準正式對外發布,而這背後 TARS 團隊功不可沒。據介紹,微服務平臺標準的定製最早在今年 1 月份發起,當時中國信通院相關團隊與 TARS 開源團隊在一場閉門會議中交流。正是這個契機,充分展現了騰訊基於 TARS 實踐微服務架構的能力,而這場閉門會也成為了雙方微服務標準合作定製的啟動會。

總結

回顧了 TARS 開源近兩年以來的種種,可以概括為幾個方面:專案獨有優勢、創新能力、開源態度及貢獻精神。開源是一件小事,但是如何做好開源卻是一件大事。在年底做了這樣一份開源相關的總結,希望廣大開源愛好者能夠從中得到一些啟發。


參考資料:

《微服務架構TARS於4月10日正式對外開源》

《騰訊與閱文技術合作 微服務框架TARS再添PHP》

《騰訊與科大訊飛技術共創,Google Protobuf進入TARS家族》

《騰訊Node.js非侵入開發框架Tars.js 2.0正式釋出》

《首個微服務平臺標準在2018可信雲大會發布》

《TARS開源專案釋出Go語言版本》