一直以來,構建一個高度可擴展且松耦合的系統是很困難的。來自Google的gRPC框架致力于解決這個領域問題。它自去年面世以來收到了社區的大量關注和使用。8月23日Google正式發布了gRPC的1.0版本,并可用于生產。在此次發布中增加了新版本對多語言的支持、API穩定性等,引起了社區廣泛的關注。
gRPC是一個高性能、開源、通用的RPC框架,它基于Proto Buffers進行數據序列化,并將移動和HTTP/2作為設計的首要考慮因素。與單一RPC請求方式不同,gPRC使用HTTP/2提供客戶和服務器間的單向或雙向流,同時可以帶來流量控制、頭部壓縮、單TCP連接上的多復用請求等特性。Google認為gRPC以“利用帶寬和CPU效率、低延遲的方式來創建大規模分布式系統,可以應用在數據中心、移動應用程序、實時通信、物聯網設備和API等,且有很好的表現。”而微服務是gRPC的主要目標。
gRPC最早源于被稱為Stubby的Google內部項目,用于一些Google內部服務間的通信。18個月前Google開源了gRPC框架,希望借此gRPC能被更廣泛地采納,并在調用Google所提供的服務時、通過互聯網與其它服務通信時或在自身產品內部應用gRPC。
gRPC是與平臺無關的RPC系統。如下圖所示,gRPC允許開發人員編寫語言無關的服務定義,指定遠程調用參數和返回類型。服務器端實現服務定義,并運行一個gRPC服務器來處理客戶的調用;而客戶端則部署支持客戶端調用的服務器端實現存根。這些代碼都可由gRPC基于服務定義和自選的開發語言在編譯器的幫助下自動生成。這使得客戶端應用程序可以像調用本地對象一樣調用服務器端應用程序,從而幫助開發人員更容易地創建分布式應用程序和服務。
同時,gRPC也可以幫助處理高效的網絡通信、認證和訪問控制(如SSL/TLS和OAuth2方式的認證)、分布式跟蹤等問題。gRPC與Proto Buffers一起可以幫助實現松耦合、工程化的速度、更高的可靠性以及操作的易用性。這也是在過去的15年中,Google內部采用Stubby和RPC框架解決的問題。Google聲稱期望通過將這一框架開源給社區,讓更多的組織和社區收益。
自2015年至今,我們也看到gRPC項目在很多方面的改進。這次1.0版本中主要包括以下幾點:
對多種語言綁定的支持,如C ++、Java、Go、Node、Ruby、Python和C#,并且可以跨Linux、Windows和Mac多種操作系統。 Objective-C和Android的Java庫也在遷移到1.0版本,使移動應用能夠更有效地連接到后端服務。 在安裝方面,gRPC支持以CocoaPods、gem、Gradle、Maven、npm、NuGet、pecl、pip或Docker鏡像等方式提供的二進制文件,這大大簡化了安裝過程。在1.0版本中,增加了絕大多數語言單行安裝、向后兼容性等的支持。 gRPC1.0依賴于Protocol Buffers最新版本3.0。此外,gRPC1.0的核心協議和API在可用性、互操作性、性能等方面都有所提升。相對于文本格式而言,ProtoBuf方式可提供更優的性能。據Google工程師Kelsey Hightower介紹,ProtoBuf編碼的消息比JSON格式消息的大小降低了一半,而序列化和反序列化所用的時間僅為后者的三分之一。為了顯示各種gRPC實現的通信延遲情況對比,Google給出了在同一數據中心中不同虛擬機實例間的通信性能精要報告。對于單一的同步安全消息,報告顯示作為基準的Netperf的延遲大約為100微秒,而C 、Java和C#語言實現的延遲大約在200到300微秒,Ruby、Python和Node.js語言實現的延遲分別在700微秒、900微秒和1,100微秒左右。
不得不說,gRPC1.0版本的發布標志著一個重要里程碑的誕生。與此同時,社區對于gRPC的興趣迅速提升,同時隨著像Netflix、CoreOS、 Square等公司和開源項目的使用,必然能夠推動gRPC作為一個通用RPC框架的發展以及相關生態圈的成熟,從而使更多的組織和社區受益。
你可以在這里查閱1.0版本的更多發布細節。如果你感興趣,不妨開始嘗試gRPC并通過郵件列表來給予反饋。