gRPC-Web:替代REST的gRPC的Javascript庫包

banq發表於2018-10-25

gRPC-Web是一個JavaScript客戶端庫,使Web應用程式能夠直接與後端gRPC服務通訊,而不需要HTTP伺服器充當中介。這意味著你現在可以透過使用.proto 檔案定義客戶端伺服器端資料型別和服務介面,輕鬆構建真正的端到端gRPC應用程式架構。因此,gRPC-Web為整個REST開發Web範例提供了一個引人注目的新選擇。
需要明確的是,REST應用程式本身沒有任何問題。使用REST API伺服器構建了大量非常成功的應用程式,但是如果這些伺服器使用非HTTP協議與後端服務進行通訊,那麼需要進行大量轉換gRPC-Web的好處從“技術”上解決這個問題。

使用gRPC-Web的優點

隨著時間的推移,gRPC-Web將提供更廣泛的功能集。但我可以看到它從一開始就提供了一些巨大的勝利:

  • 端到端gRPC - 如上所述,使用gRPC-Web,可以正式從堆疊中刪除REST元件並將其替換為純gRPC,從而使能夠使用Protocol Buffers建立整個 RPC管道。

  • 前端和後端團隊之間更緊密的協調- 使用Protocol Buffers定義整個RPC管道,不再需要將“微服務團隊”與“客戶端團隊”分離。客戶端 - 後端互動只是一個gRPC層。

  • 輕鬆生成客戶端庫- 使用gRPC-Web,意味著後端伺服器是gRPC伺服器而不是HTTP伺服器,這意味著您的所有服務都是客戶端庫也可以是gRPC庫。需要Ruby,Python,Java和其他4種語言的客戶端庫嗎?您不再需要為所有這些客戶端編寫HTTP客戶端。


下面是一個Protocol Buffer格式定義:

syntax = “proto3”;

package todos;

message Todo {
  string content = 1;
  bool finished = 2;
}

message GetTodoRequest {
  int32 id = 1;
}

service TodoService {
  rpc GetTodoById (GetTodoRequest) returns (Todo);
}


可以使用protoc 命令列工具根據這個.proto 定義使用生成CommonJS的客戶端程式碼:

protoc echo.proto \
--js_out = import_style = commonjs:./ output \
--grpc-web_out = import_style = CommonJS的:./輸出


現在從後端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()}`);
   }
 }
});


同樣,沒有HTTP程式碼或方法,沒有JSON解析,沒有頭Header協商。您宣告瞭資料型別和服務介面,並且gRPC-Web摘錄了所有“hard wiring”樣板程式碼,為您提供了一個乾淨且人性化的API(基本上與當前用於gRPC API的Node.js相同的API,剛剛轉移到客戶端)。

在後端,gRPC伺服器可以用任何支援gRPC的語言編寫,包括Go,Java,C ++,Ruby,Node.js等等。最後一塊拼圖是服務代理。從一開始,gRPC-Web將支援Envoy作為預設服務代理,它具有內建的envoy.grpc_web 過濾器,只需幾行復制和可配置配置即可應用。

gRPC-Web


 

相關文章