首先先搞清楚什么是Rpc(轉自知乎)...
早期單機時代,一台電腦上運行多個進程,大家各干各的,老死不相往來。假如A進程需要一個畫圖的功能,B進程也需要一個畫圖的功能,程序員就必須為兩個進程都寫一個畫圖的功能。這不是整人么?於是就出現了IPC(Inter-process communication,單機中運行的進程之間的相互通信)。OK,現在A既然有了畫圖的功能,B就調用A進程上的畫圖功能好了,程序員終於可以偷下懶了。
到了網絡時代,大家的電腦都連起來了。以前程序只能調用自己電腦上的進程,能不能調用其他機器上的進程呢?於是就程序員就把IPC擴展到網絡上,這就是RPC(遠程過程調用)了。現在不僅單機上的進程可以相互通信,多機器中的進程也可以相互通信了。
要知道實現RPC很麻煩呀,什么多線程、什么Socket、什么I/O,都是讓咱們普通程序員很頭疼的事情。於是就有牛人開發出RPC框架(比如,CORBA、RMI、Web Services、RESTful Web Services等等)。
OK,現在可以定義RPC框架的概念了。簡單點講,RPC框架就是可以讓程序員來調用遠程進程上的代碼一套工具。有了RPC框架,咱程序員就輕松很多了,終於可以逃離多線程、Socket、I/O的苦海了。
至於最近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使用、和電池壽命。
gRPC具有以下重要特征:
強大的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中,其主要應用場景如下:
- 低延遲、高擴展性、分布式的系統
- 同雲服務器進行通信的移動應用客戶端
- 設計語言獨立、高效、精確的新協議
- 便於各方面擴展的分層設計,如認證、負載均衡、日志記錄、監控等