gRPC 簡介及優(yōu)缺點

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ù)進行,具體可以參考下圖。


RPC.png

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/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文出處:gRPC gRPC分享 概述 gRPC 一開始由 google 開發(fā),是一款語言中立、平臺中立、開源的遠...
    小波同學(xué)閱讀 7,677評論 0 18
  • GRPC是基于protocol buffers3.0協(xié)議的. 本文將向您介紹gRPC和protocol buffe...
    二月_春風閱讀 18,214評論 2 28
  • gRPC 是一個高性能、通用的開源RPC框架,基于HTTP/2協(xié)議標準和Protobuf序列化協(xié)議開發(fā),支持眾多的...
    小波同學(xué)閱讀 19,814評論 6 19
  • 簡單介紹RPC協(xié)議及常見框架,對比傳統(tǒng)restful api和RPC方式的優(yōu)缺點。常見RPC框架,gRPC及序列化...
    王勝廣閱讀 147,107評論 9 158
  • 1.簡介 在gRPC中,客戶端應(yīng)用程序可以直接調(diào)用不同計算機上的服務(wù)器應(yīng)用程序上的方法,就像它是本地對象一樣,使您...
    第八共同體閱讀 2,087評論 0 6

友情鏈接更多精彩內(nèi)容