RPC(Remote Procedure Call)
RPC(Remote Procedure Call)— 遠程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
RPC采用客戶端/服務(wù)器模式。請求程序就是一個客戶端,而服務(wù)提供程序就是一個服務(wù)器。首先,客戶端調(diào)用進程發(fā)送一個有進程參數(shù)的調(diào)用信息到服務(wù)進程,然后等待應(yīng)答信息。在服務(wù)器端,進程保持睡眠狀態(tài)直到調(diào)用信息到達為止。當一個調(diào)用信息到達,服務(wù)器獲得進程參數(shù),計算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用進程接收答復(fù)信息,獲得進程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進行,具體可以參考下圖。

gRPC
簡介
gRPC 一開始由 Google 開發(fā),是一款語言中立、平臺中立、開源的遠程過程調(diào)用(RPC)系統(tǒng)。
在 gRPC 里客戶端應(yīng)用可以像調(diào)用本地對象一樣直接調(diào)用另一臺不同的機器上服務(wù)端應(yīng)用的方法,使得您能夠更容易地創(chuàng)建分布式應(yīng)用和服務(wù)。與許多 RPC 系統(tǒng)類似,gRPC 也是基于以下理念:定義一個服務(wù),指定其能夠被遠程調(diào)用的方法(包含參數(shù)和返回類型)。在服務(wù)端實現(xiàn)這個接口,并運行一個 gRPC 服務(wù)器來處理客戶端調(diào)用。在客戶端擁有一個存根能夠像服務(wù)端一樣的方法。
gRPC的特性
基于HTTP/2
HTTP/2 提供了連接多路復(fù)用、雙向流、服務(wù)器推送、請求優(yōu)先級、首部壓縮等機制??梢怨?jié)省帶寬、降低TCP鏈接次數(shù)、節(jié)省CPU,幫助移動設(shè)備延長電池壽命等。gRPC 的協(xié)議設(shè)計上使用了HTTP2 現(xiàn)有的語義,請求和響應(yīng)的數(shù)據(jù)使用HTTP Body 發(fā)送,其他的控制信息則用Header 表示。
IDL使用ProtoBuf
gRPC使用ProtoBuf來定義服務(wù),ProtoBuf是由Google開發(fā)的一種數(shù)據(jù)序列化協(xié)議(類似于XML、JSON、hessian)。ProtoBuf能夠?qū)?shù)據(jù)進行序列化,并廣泛應(yīng)用在數(shù)據(jù)存儲、通信協(xié)議等方面。壓縮和傳輸效率高,語法簡單,表達力強。
多語言支持
gRPC支持多種語言(C, C++, Python, PHP, Nodejs, C#, Objective-C、Golang、Java),并能夠基于語言自動生成客戶端和服務(wù)端功能庫。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發(fā)中,其中,grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經(jīng)支持Android開發(fā)。
gRPC優(yōu)缺點
優(yōu)點
- protobuf二進制消息,性能好/效率高(空間和時間效率都很不錯)
- proto文件生成目標代碼,簡單易用
- 序列化反序列化直接對應(yīng)程序中的數(shù)據(jù)類,不需要解析后在進行映射(XML,JSON都是這種方式)
- 支持向前兼容(新加字段采用默認值)和向后兼容(忽略新加字段),簡化升級
- 支持多種語言(可以把proto文件看做IDL文件)
- Netty等一些框架集成
缺點:
- GRPC尚未提供連接池,需要自行實現(xiàn)
- 尚未提供“服務(wù)發(fā)現(xiàn)”、“負載均衡”機制
- 因為基于HTTP2,絕大部多數(shù)HTTP Server、Nginx都尚不支持,即Nginx不能將GRPC請求作為HTTP請求來負載均衡,而是作為普通的TCP請求。(nginx1.9版本已支持)
- Protobuf二進制可讀性差(貌似提供了Text_Fromat功能)
默認不具備動態(tài)特性(可以通過動態(tài)定義生成消息類型或者動態(tài)編譯支持)
gRPC通信方式
簡單 RPC ( Simple RPC )
這就是一般的rpc調(diào)用,一個請求對象對應(yīng)一個返回對象。
// proto語法
rpc simpleHello(Person) returns (Result) {}
服務(wù)端流式 RPC ( Server-side streaming RPC )
一個請求對象,服務(wù)端可以傳回多個結(jié)果對象
//proto語法
rpc serverStreamHello(Person) returns (stream Result) {}
客戶端流式rpc ( Client-side streaming RPC )
客戶端傳入多個請求對象,服務(wù)端返回一個響應(yīng)結(jié)果
// proto語法
rpc clientStreamHello(stream Person) returns (Result) {}
雙向流式rpc ( Bidirectional streaming RPC )
結(jié)合客戶端流式rpc和服務(wù)端流式rpc,可以傳入多個對象,返回多個響應(yīng)對象
// proto語法
rpc biStreamHello(stream Person) returns (stream Result) {}
參考
官網(wǎng):https://grpc.io/docs/