上圖描述了一個RPC的完整調用流程: 1:client向client stub發起方法調用請求。 2:client stub接收到請求後,將方法名,請求參數等信息進行編碼序列化。 3:client stub經過配置的ip和端口使用socket經過網絡向遠程服務器server發起請求。 4:遠程服務器server接收到請求,解碼反序列化請求信息。 5:server將請求信息交給server stub,server stub找到對應的本地真實方法實現。 6:本地方法處理調用請求並將返回的數據交給server stub。 7:server stub 將數據編碼序列化交給操做系統內核,使用socket將數據返回。 8:client端socket接收到遠程服務器的返回信息。 9:client stub將信息進行解碼反序列化。 10:client收到遠程服務器返回的信息。
上圖中有一個stub(存根)的概念。html
stub負責接收本地方法調用,並將它們委託給各自的具體實現對象。java
server端stub又被稱爲skeleton(骨架)。能夠理解爲代理類。而實際上基於Java的RPC框架stub基本上也都是使用動態代理。git
咱們所說的client端和server端在RPC中通常也都是相對的概念。github
而所謂的RPC框架也就是封裝了上述流程中2-9的過程,讓開發者調用遠程方法就像調用本地方法同樣。golang
Dubbo:瀏覽器
阿里開源的基於TCP的RPC框架,基本上是國內生產環境應用最廣的開發框架了。使用zookeeper作服務的註冊與發現,使用Netty作網絡通訊。遺憾的是不能跨語言,目前只支持Java。服務器
Thrift:網絡
Facebook開源的跨語言的RPC框架,經過IDL來定義RPC的接口和數據類型,使用thrift編譯器生成不一樣語言的實現。聽說是目前性能最好的RPC框架,只是暫沒使用過。框架
gRPC:curl
這個是咱們今天要聊的重點。gRPC是Google的開源產品,是跨語言的通用型RPC框架,使用Go語言編寫。 Java語言的應用一樣使用了Netty作網絡通訊,Go採用了Goroutine作網絡通訊。序列化方式採用了Google本身開源的Protobuf。請求的調用和返回使用HTTP2的Stream。
SpringCloud:
SpringCloud並不能算一個RPC框架,它是Spring家族中一個微服務治理的解決方案,是一系列框架的集合。但在這個方案中,微服務之間的通訊使用基於HTTP的Restful API,使用Eureka或Consul作服務註冊與發現,使用聲明式客戶端Feign作服務的遠程調用。這一系列的功能整合起來構成了一套完整的遠程服務調用。
如何選擇
若是公司項目使用Java並不牽扯到跨語言,且規模並無大到難以治理,我推薦Dubbo。若是項目規模大,服務調用錯綜複雜,我推薦SpringCloud。
若是牽扯到跨語言,我推薦gRPC,這也是目前我司的選擇。即便Thrift性能是gRPC的2倍,但沒辦法,它有個好爹,如今咱們的開發環境考慮最多的仍是生態,不得不向Google爸爸臣服。
一個RPC框架必須有兩個基礎的組成部分:數據的序列化和進程數據通訊的交互方式。
對於序列化gRPC採用了自家公司開源的Protobuf。什麼是Protobuf?先看一句網絡上 大部分的解釋:
Google Protocol Buffer(簡稱 Protobuf)是一種輕便高效的結構化數據存儲格式,平臺無關、語言無關、可擴展,可用於通信協議和數據存儲等領域。
上句有幾個關鍵點:它是一種數據存儲格式,跨語言,跨平臺,用於通信協議和數據存儲。
這麼看和咱們熟悉的JSON相似,但其實着重點有些本質的區別:
JSON主要是用於數據的傳輸,由於它輕量級,可讀性好,解析簡單。
Protobuf主要是用於跨語言的IDL,它除了和JSON、XML同樣能定義結構體以外,還可使用自描述格式定於出接口的特性,
並可使用針對不一樣語言的protocol編譯器產生不一樣語言的stub類。因此自然的適用於跨語言的RPC框架中。
而關於進程間的通信,無疑是Socket。Java方面gRPC一樣使用了成熟的開源框架Netty。使用Netty Channel做爲數據通道。傳輸協議使用了HTTP2。
經過以上的分析,咱們能夠將一個完整的gRPC流程總結爲如下幾步:
項目需求:
go調用java傳遞請求參數,並接收java返回的數據。(項目中本人採用http方式創建go&java鏈接)
爲了體現gRPC跨語言的特性,咱們使用兩種語言:Go實現server端,Java做爲client端來實現
Step1:登陸Google的 github下載對應Protocol Buffers版本 (本人下載all)
// Step1:安裝 Protocol Buffer 依賴 // 注:Protocol Buffer 依賴於 autoconf、automake、libtool、curl brew install autoconf automake libtool curl // Step2:進入 Protocol Buffer安裝包 解壓後的文件夾(個人解壓文件放在桌面) cd Desktop/protobuf-3.6.1 // Step3:運行 autogen.sh 腳本 ./autogen.sh // Step4:運行 configure.sh 腳本 ./configure // Step5:編譯未編譯的依賴包 make // Step6:檢查依賴包是否完整 make check // Step7:開始安裝Protocol Buffer make install
// 在 終端 下輸入 protoc - - version
執行protoc命令若是返回以下信息說明安裝成功
未完待緒。。。。