主題:GRPC的使用
HTTP2.0
GRPC的概述

- 安全認證:ALTS [ Application Layer Transport Security 應用層傳輸安全 ]
- 傳輸協議:HTTP2
使用流程
定義一個服務
syntax = "proto3";
option java_package = "io.grpc.examples";
// The greeter service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
- 單項 RPC,即客戶端發送一個請求給服務端,從服務端獲取一個應答,就像一次普通的函數調用。
rpc SayHello(HelloRequest) returns (HelloResponse){}
- 服務端流式 RPC,即客戶端發送一個請求給服務端,可獲取一個數據流用來讀取一系列消息。客戶端從返回的數據流里一直讀取直到沒有更多消息為止。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){}
- 客戶端流式 RPC,即客戶端用提供的一個數據流寫入並發送一系列消息給服務端。一旦客戶端完成消息寫入,就等待服務端讀取這些消息並返回應答。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {}
- 雙向流式 RPC,即兩邊都可以分別通過一個讀寫數據流來發送一系列消息。這兩個數據流操作是相互獨立的,所以客戶端和服務端能按其希望的任意順序讀寫,例如:服務端可以在寫應答前等待所有的客戶端消息,或者它可以先讀一個消息再寫一個消息,或者是讀寫相結合的其他方式。每個數據流里消息的順序會被保持。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){}
生成代碼
服務端
客戶端
- 阻塞/同步 : RPC 調用等待服務器響應,並且要么返回應答,要么造成異常
- 非阻塞/異步 : 存根可以向服務器發起非阻塞調用,應答會異步返回。可以使用異步存根去發起特定類型的流式調用。
其他RPC框架的對比
Dubbo
- 側重重服務治理,主要的精力放在服務發現、路由、容錯處理等方面
- Dubbo3.0 的協議基於 gRPC(http2.0), 功能增強
Thrift
- 側重跨語言調用,能夠支持大部分的語言進行語言無關的調用(同GRPC)
- 社區活躍度 GRPC>Thrift
- 文檔詳細完善 GRPC>Thrift
- 特性豐富度 Thrift>GRPC
- Thrift的協議層和傳輸層可拓展性強