gRPC 1.0於2016年8月發布,現已發展成為應用通信的首選技術解決方案之一。它已被全球的初創公司、企業公司和開源項目采用。它對多語言環境的支持、關注性能、類型安全性和開發者生產力已經改變了開發者設計架構的方式。
到目前為止,基本上只有移動應用程序和后端開發者獲得這些好處,而前端開發者不得不繼續依賴jsON REST接口作為其主要的信息交換方式。然而,隨着gRPC-Web的發布,gRPC有望成為前端開發者工具箱中的有價值補充。
在這篇文章中,我將描述gRPC在瀏覽器中的一些歷史,探索當前的狀態,並分享對未來的一些看法。
初期
在2016年夏天,Google和Improbable(1)的團隊獨立地開始實施可以稱為“瀏覽器的gRPC”的東西。他們很快發現了彼此的存在,並聚在一起為新協議定義了規范(2)。
gRPC-Web規范
目前無法在瀏覽器中實現HTTP/2 gRPC規范(3),因為沒有瀏覽器API對請求提供足夠的細粒度控制。例如:沒有辦法強制使用HTTP/2,即使有,也無法在瀏覽器中訪問原始HTTP/2幀。gRPC-Web規范從HTTP/2規范的角度出發,然后定義差異。這些特別包括:
- 支持HTTP/1.1和HTTP/2。
- 在請求/響應主體的最末端發送gRPC跟蹤程序,如gRPC消息頭(4)中的新位所示。
- 用於在gRPC-Web請求和gRPC HTTP/2響應之間進行轉換的強制代理。
廣州vi設計公司http://www.maiqicn.com 辦公資源網站大全 https://www.wode007.com
技術部分
基本思想是讓瀏覽器發送正常的HTTP請求(使用Fetch或XHR),並在gRPC服務器前面有一個小代理,將請求和響應轉換為瀏覽器可以使用的內容。

兩個實現方式
Google和Improbable的團隊在兩個不同的存儲庫中實現了規范(5,6),並且采用了稍微不同的實現,它們都不完全符合規范,在很長一段時間內都不兼容另一個代理(7,8)。
Improbable的gRPC-Web客戶端(9)以TypeScript實現,可以在npm上以grpc-web-client(10)獲得。還有一個Go代理可用,既可作為導入現有Go gRPC服務器的軟件包(11),也可作為獨立代理,將任意gRPC服務器暴露給gRPC-Web前端(12)。
Google的gRPC-Web客戶端(13)使用Google Closure庫(14)以JavaScript實現,可以在npm上以grpc-web(15)獲得。它最初附帶作為NGINX擴展實現的代理(16),但后來在Envoy代理HTTP過濾器(17)上提供,該過濾器自v1.4.0以來在所有版本中都可獲得。
功能集
gRPC HTTP/2的實現都支持四種方法類型:一元(unary)、服務器端、客戶端和雙向流。但是,gRPC-Web規范並未強制要求任何客戶端或雙向流支持,只是在瀏覽器中實現WHATWG Streams(18)后才會實現。
Google客戶端支持一元和服務器端流,但僅在與grpcwebtext模式一起使用時才支持。grpcweb模式只完全支持一元請求。這兩種模式指定了在請求和響應中編碼protobuf有效負載的不同方法。
Improbable客戶端支持一元和服務器端流,並且實現根據瀏覽器功能在XHR和Fetch之間自動選擇。
這表格總結了支持的不同功能:

有關此表格的更多信息,請參閱我在github上的兼容性測試repo。
兼容性測試可能演變為一些自動化測試框架,以便在將來強制執行和記錄各種兼容性。
兼容性問題
當然,有兩個不同的代理也會出現兼容性問題。幸運的是,最近已經解決了這些問題,因此你可以期望將任一客戶端與任一代理一起使用。
未來
Google的實施在2018年10月(21)公布了版本1.0和一般可用性,並公布了未來目標的路線圖(22),包括:
- 類似jsON的有效消息編碼
- Node、Python、Java等的進程內代理
- 與流行框架集成(react、Angular、vue)
- Fetch API傳輸以實現內存高效的流式傳輸
- 雙向流支持
Google正在尋求有關哪些功能對社區很重要的反饋,如果你認為其中任何一項對您特別有價值,請填寫他們的調查(23)。
兩個項目最近的對話已經同意將Google客戶端和Envoy代理作為新用戶的首選解決方案。Improbable的客戶端和代理將作為規范的替代實現,而不依賴於Google Closure,但應被視為實驗性的。將為現有用戶生成遷移指南,以便遷移到Google客戶端,團隊也正在共同協作所生成的API。
結論
Google客戶端將繼續以穩定的速度實施新的功能和修復,其團隊致力於成功,並且它是官方的gRPC客戶。它沒有像Improbable客戶端那樣的Fetch API支持,但如果這是社區所需的一個重要功能,它將被添加。Google團隊和更大的社區正在為官方客戶端進行合作,以使gRPC社區受益。自GA宣布以來,社區對Google gRPC-Web存儲庫的貢獻大幅增加。
在兩個代理之間進行選擇時,功能沒有區別,所以它成為你部署模型的問題。Envoy將適合某些場景,而進程中的Go代理有其自身的優勢。
如果你今天開始使用gRPC-Web,請先試用Google客戶端。它具有嚴格的API兼容性保證,並建立在Gmail和Google Maps使用的堅如磐石的Google Closure庫基礎之上。如果你需要Fetch API的內存效率,或實驗性的websocket客戶端和雙向流,Improbable客戶端是一個不錯的選擇,並且在可預見的未來繼續由Improbable使用和維護。
無論哪種方式,gRPC-Web都是Web開發者的絕佳選擇。它將復雜協議的可移植性、性能和工程設計引入瀏覽器,並為前端開發者帶來激動人心的時刻!
