gRPC-Web发布,REST又要被干掉了?
云原生計算基金會(CNCF)正式發布GA版本的gRPC-Web,這是一個JavaScript客戶端庫,使Web應用程序能夠直接與后端gRPC服務通信,不需要HTTP服務器充當中介。這意味著你現在可以通過.proto文件來定義客戶端和服務器端數據類型和服務接口,輕松構建真正的端到端gRPC應用程序架構。gRPC-Web為Web開發提供了REST之外的另一個選擇。
\\基礎
\\gRPC-Web讓你能夠使用.proto來定義客戶端Web應用程序和后端gRPC服務器之間的服務“契約”,并自動生成客戶端JavaScript(你可以選擇Closure編譯器或使用更為廣泛的CommonJS)。你可以不用再為這些事情操心:創建自定義JSON序列化和反序列化邏輯、處理HTTP狀態代碼(可能因??REST API而異)、Content-Type協商等。
\\從更廣泛的架構角度來看,gRPC-Web讓端到端的gRPC成為可能。如下圖所示:
\\\\在左側,一個客戶端應用程序通過Protocol Buffers與一個gRPC后端服務器通信,然后這個服務器也通過Protocol Buffers與其他的gRPC后端服務器通信。在右側,Web應用程序通過HTTP與后端REST API服務器通信,然后這個服務器又通過Protocol Buffers與其他后端服務通信。
\\需要明確指出的是,右側的REST應用程序本身沒有任何問題。已經有大量非常成功的應用程序是基于REST API服務器而構建的,這些服務器使用非HTTP協議與后端服務進行通信。但如果這些應用程序的開發過程只圍繞一個協議和一組.proto接口(以及一組服務契約)進行,那么就可以節省無數個小時的時間以及避免那些令人頭疼的問題。gRPC-Web的好處不僅僅體現在“技術”方面,還體現在對組織的影響上。圖中的亮橙色線不僅僅是一個協議——它代表的是獨立的工作和認知負荷來源,而現在,你完全可以把它變成亮綠色。
\\gRPC-Web的優勢
\\隨著時間的推移,gRPC-Web將提供更廣泛的特性集。目前,我可以看到的是:
\\- 端到端gRPC——如上所述,有了gRPC-Web,你就可以正式從技術棧中移除REST組件,并用gRPC來替換,從而可以使用Protocol Buffers來創建整個RPC管道。想象一下這樣的場景:一個客戶端請求被轉發到HTTP服務器上,HTTP服務器與后端的5個gRPC服務進行交互。你很可能需要花費很多時間來構建HTTP交互層,因為你需要構建整個管道的其余部分。\
- 前端和后端團隊之間更緊密的協作——回看上面的圖表,使用Protocol Buffers定義整個RPC管道后,你就不再需要將“微服務團隊”與“客戶端團隊”捆綁在一起。客戶端與后端之間的交互只是多了一個gRPC層。\
- 輕松生成客戶端庫——使用gRPC-Web之后,與“外部”世界交互的服務器變成了gRPC服務器而不是HTTP服務器,這意味著所有的客戶端庫都可以是gRPC庫。需要Ruby、Python、Java和其他4種語言的客戶端庫嗎?你不再需要為所有這些語言編寫HTTP客戶端了。\
一個gRPC-Web示例
\\上面介紹了gRPC-Web在大規模應用中的一些優勢。現在讓我們通過一個例子來說明:一個簡單的TODO應用程序。在gRPC-Web中,你可以從一個簡單的todos.proto定義開始,如下所示:
\\\syntax = “proto3”;\\?\package todos;\\?\message Todo {\ string content = 1;\ bool finished = 2;\}\\?\message GetTodoRequest {\ int32 id = 1;\}\\?\service TodoService {\ rpc GetTodoById (GetTodoRequest) returns (Todo);\}\\\你可以使用這個.proto定義和protoc命令行工具生成CommonJS客戶端代碼:
\\\protoc echo.proto \\\ --js_out=import_style=commonjs:./output \\\ --grpc-web_out=import_style=commonjs:./output\\\然后從后端gRPC服務器獲取TODO列表:
\\\const {GetTodoRequest} = require(‘./todos_pb.js’);\\?\const {TodoServiceClient} = require(‘./todos_grpc_web_pb.js’);\\?\const todoService = new proto.todos.TodoServiceClient(‘http://localhost:8080’);\const todoId = 1234;\\?\\?\var getTodoRequest = new proto.todos.GetTodoRequest();\\?\getTodoRequest.setId(todoId);\\?\var metadata = {};\\?\var getTodo = todoService.getTodoById(getTodoRequest, metadata, (err, response) =\u0026gt; {\\?\ if (err) {\ console.log(err);\ } else {\ const todo = response.todo();\\?\ if (todo == null) {\ console.log(`A TODO with the ID ${todoId} wasn’t found`);\ } else {\ console.log(`Fetched TODO with ID ${todoId}: ${todo.content()}`);\ }\ }\});\\這里沒有HTTP代碼或方法,沒有JSON解析,沒有頭部信息協商。你聲明了數據類型和服務接口,gRPC-Web抽離了所有的樣板代碼,留給你的是一組干凈且人性化的API。
\\在后端,gRPC服務器可以使用任何支持gRPC的語言編寫,包括Go、Java、C++、Ruby、Node.js等等(請參閱官方gRPC文檔中的與開發語言相關的文檔https://grpc.io/docs/)。最后一個關鍵組件是服務代理。從一開始,gRPC-Web支持將Envoy作為默認服務代理,它提供了內置的envoy.grpc_web過濾器,只需幾行配置即可。更多信息將在Envoy博客上(https://blog.envoyproxy.io/)詳細說明。
\\下一步
\\GA版本的發布意味著核心構建塊已經就緒,可以用在生產環境中。但gRPC-Web還將帶來很多其他的東西。可以查看官方的開發路線圖(https://github.com/grpc/grpc-web/blob/master/ROADMAP.md),以便了解核心團隊所設想的未來。
\\如果你有興趣為gRPC-Web做出貢獻,核心團隊希望社區能夠為以下事項提供幫助:
\\- 前端框架集成——常用的前端框架(如React、Angular和Vue)尚未正式支持gRPC-Web。我們希望看到這些框架能夠支持它,因為每個框架都將從gRPC中受益匪淺。\
- 特定于語言的代理支持——截止GA版本,Envoy是gRPC-Web的默認代理,通過一個特殊的模塊提供支持。我們也很樂意看到使用其他特定語言開發進程內代理。進程內代理移除了對特殊代理的依賴——例如Envoy和nginx——并且可以讓gRPC-Web的使用變得更加容易。\
查看英文原文:https://www.cncf.io/blog/2018/10/24/grpc-web-is-going-ga/
總結
以上是生活随笔為你收集整理的gRPC-Web发布,REST又要被干掉了?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器桥接拨号场景-路由器拨号 桥接
- 下一篇: 修改银行卡密码要提供房产证