首先先搞清楚什麼是Rpc(轉自知乎)...php
早期單機時代,一臺電腦上運行多個進程,你們各幹各的,老死不相往來。假如A進程須要一個畫圖的功能,B進程也須要一個畫圖的功能,程序員就必須爲兩個進程都寫一個畫圖的功能。這不是整人麼?因而就出現了IPC(Inter-process communication,單機中運行的進程之間的相互通訊)。OK,如今A既然有了畫圖的功能,B就調用A進程上的畫圖功能好了,程序員終於能夠偷下懶了。java
到了網絡時代,你們的電腦都連起來了。之前程序只能調用本身電腦上的進程,能不能調用其餘機器上的進程呢?因而就程序員就把IPC擴展到網絡上,這就是RPC(遠程過程調用)了。如今不只單機上的進程能夠相互通訊,多機器中的進程也能夠相互通訊了。node
要知道實現RPC很麻煩呀,什麼多線程、什麼Socket、什麼I/O,都是讓我們普通程序員很頭疼的事情。因而就有牛人開發出RPC框架(好比,CORBA、RMI、Web Services、RESTful Web Services等等)。python
OK,如今能夠定義RPC框架的概念了。簡單點講,RPC框架就是可讓程序員來調用遠程進程上的代碼一套工具。有了RPC框架,咱程序員就輕鬆不少了,終於能夠逃離多線程、Socket、I/O的苦海了。git
至於最近Java中流行的Netty,沒玩過。可是大體瞭解過,Netty、Mina是遊戲行業作服務器開發的Java程序員用的比較多的PRC框架(咱們學生主要是Java方向的,有很多人畢業後從事遊戲開發)。聽說互聯網公司用的也比較多。這兩行業都有高併發量的、長鏈接、分佈式、異步通信、大數據量等特色。Netty這種RPC框架封裝和優化了Java NIO和異步網絡編程的一些繁瑣的細節,一方面可讓開發者專一於業務邏輯的實現,一方面只須要調用Netty封裝的API就能夠很快編寫出高性能的服務器。程序員
gRPC是一個高性能、通用的開源RPC框架,其由Google主要面向移動應用開發並基於HTTP/2協議標準而設計,基於ProtoBuf(Protocol Buffers)序列化協議開發,且支持衆多開發語言。gRPC提供了一種簡單的方法來精確地定義服務和爲iOS、Android和後臺支持服務自動生成可靠性很強的客戶端功能庫。客戶端充分利用高級流和連接功能,從而有助於節省帶寬、下降的TCP連接次數、節省CPU使用、和電池壽命。github
gRPC具備如下重要特徵:objective-c
強大的IDL特性
gRPC使用ProtoBuf來定義服務,ProtoBuf是由Google開發的一種數據序列化協議(相似於XML、JSON、hessian)。ProtoBuf可以將數據進行序列化,並普遍應用在數據存儲、通訊協議等方面。不過,當前gRPC僅支持 Protobuf ,且不支持在瀏覽器中使用。因爲gRPC的設計可以支持支持多種數據格式,因此讀者可以很容易實現對其餘數據格式(如XML、JSON等)的支持。編程
定義服務的示例代碼以下:瀏覽器
message HelloRequest { string greeting = 1; } message HelloResponse { string reply = 1; } service HelloService { rpc SayHello(HelloRequest) returns (HelloResponse); }
支持多種語言
gRPC支持多種語言,並可以基於語言自動生成客戶端和服務端功能庫。目前,在GitHub上已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發中,其中 grpc支持C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經支持Android開發。
基於HTTP/2標準設計
因爲gRPC基於HTTP/2標準設計,因此相對於其餘RPC框架,gRPC帶來了更多強大功能,如雙向流、頭部壓縮、多複用請求等。這些功能給移動設備帶來重大益處,如節省帶寬、下降TCP連接次數、節省CPU使用和延長電池壽命等。同時,gRPC還可以提升了雲端服務和Web應用的性能。gRPC既可以在客戶端應用,也可以在服務器端應用,從而以透明的方式實現客戶端和服務器端的通訊和簡化通訊系統的構建。
gRPC已經應用在Google的雲服務和對外提供的API中,其主要應用場景以下: