我們很高興宣布gRPC-Web的GA版本 ,這是一個JavaScript客戶端庫,可讓網絡應用直接與gRPC后端服務進行通信,而無需HTTP服務器充當中介。“ GA”表示gRPC-Web現在可以普遍使用,並且穩定並且可以用於生產。
使用gRPC-Web,您現在可以通過使用協議緩沖區定義客戶端和服務器端數據類型以及服務接口,輕松地構建真正的端到端gRPC應用程序體系結構。一段時間以來,這個功能一直是人們急需的功能,我們終於很高興地說它現在已經可以投入生產了。此外,能夠訪問gRPC服務為基於Web的工具開辟了令人興奮的新可能性 圍繞gRPC。
基礎
與gRPC一樣,gRPC-Web允許您使用協議緩沖區在客戶端(Web)和后端gRPC服務之間定義服務“合同”。然后可以自動生成客戶端。為此,您可以在“關閉”之間選擇編譯器或更廣泛使用的CommonJS。此開發過程消除了管理諸如創建自定義JSON序列化和反序列化邏輯,調整HTTP狀態代碼(在REST API中可能有所不同),管理內容類型協商等問題的需要。
從更廣泛的架構角度來看,gRPC-Web支持端到端gRPC。下圖說明了這一點:
圖1.帶gRPC-Web的gRPC(左)和帶REST的gRPC(右)
在左側的gRPC-Web世界中,客戶端應用程序向gRPC后端服務器講協議緩沖區,而gRPC后端服務器向其他gRPC后端服務講協議緩沖區。在右側的REST Universe中,Web應用程序將HTTP與后端REST API服務器進行通信,然后該服務器將對后端服務進行協議緩沖。
使用gRPC-Web的優點
隨着時間的推移,gRPC-Web將提供范圍更廣的功能集,但是今天的1.0版本中包含以下內容:
- 端到端gRPC-使您可以使用協議緩沖區來構建整個RPC管道。想象一個場景,其中客戶端請求發送到HTTP服務器,然后HTTP服務器與5個后端gRPC服務進行交互。您很有可能會花費與構建整個管道其余部分一樣多的時間來構建HTTP交互層。
- 前端和后端團隊之間的緊密協作—使用協議緩沖區定義了整個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
使用以下命令從此定義生成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) => {
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()}`);
}
}
});
聲明數據類型和服務接口后,gRPC-Web將抽象出所有樣板,為您提供干凈且人性化的API(與gRPC API的當前Node.js基本上相同的API,只是轉移到了客戶端) )。
在后端,可以使用支持gRPC的任何語言編寫gRPC服務器,例如Go,Java,C ++,Ruby,Node.js等。最后一個難題是服務代理。從一開始,gRPC-Web將支持Envoy作為默認服務代理,它具有內置的envoy.grpc_web過濾器 只需幾行配置就可以應用。
下一步
使用GA意味着核心構建塊已牢固安裝到位,並可以在生產Web應用程序中使用。但是gRPC-Web還有很多。查看官方路線圖 了解核心團隊在不久的將來的構想。
如果您有興趣為gRPC-Web做出貢獻,我們希望社區提供以下幫助:
-
前端框架集成-常用的前端框架,如React,Vue和角尚未提供對gRPC-Web的官方支持。但是我們希望看到這些框架支持它,因為這些前端框架和gRPC-Web之間的集成可以成為向應用程序提供用戶可感知的性能優勢的工具。如果您有興趣建立對這些前端框架的支持,請在gRPC.io郵件列表中告知我們,在github上提交功能請求 或通過下面的功能調查表。
-
特定語言的代理支持-從GA版本開始,Envoy是gRPC-Web的默認代理,通過特殊模塊提供支持。還支持NGINX。但是,我們也希望看到針對特定語言的進程內代理的開發,因為它們消除了對諸如Envoy和nginx之類的特殊代理的需求,並且將使使用gRPC-Web變得更加容易。
我們也很樂意從社區獲得功能請求。當前,提出功能請求的最佳方法是填寫gRPC-Web路線圖功能調查。填寫表單時,請在“我要貢獻”部分中列出您想看到的功能,並讓我們知道您是否想為這些功能的開發做出貢獻。gRPC-Web工程師將確保在項目開發過程中牢記這些信息。