專案中要使用rpc協議框架來實現兩個系統之間的介面呼叫。a系統呼叫b系統的相應介面,因為考慮到http請求會包含更多冗餘資訊,造成請求過大,因此選用了rpc眾多框架中的grpc。
grpc是google開源的rpc框架,目前版本1.0.0,看jar包引入包括netty與okhttp,同時序列化中使用的是protobuf(google自主研發的序列化方式——支援http2.0與多路復用,同時對資料進行壓縮,效率較高,跨平台),目前grpc中的protobuf使用的是3.0最新版本(除了部分語言目前僅支援protobuf 2版本)。
為什麼要使用grpc:
rpc可以基於tcp協議也可以基於http協議,基於tcp的rpc協議較為難讀,不友好,雖然資料量小精簡,但如果對資料速度及io要求沒有那麼高,完全可以使用基於http協議的rpc。由於grpc基於http/2標準設計,所以相對於其他rpc框架,grpc帶來了更多強大功能,如雙向流、頭部壓縮、多復用請求等。這些功能給移動裝置帶來重大益處,如節省頻寬、降低tcp鏈結次數、節省cpu使用和延長電池壽命等。同時,grpc還能夠提高了雲端服務和web應用的效能。grpc既能夠在客戶端應用,也能夠在伺服器端應用,從而以透明的方式實現客戶端和伺服器端的通訊和簡化通訊系統的構建。
為什麼要使用protobuf:
protocol buffers 是一種輕便高效的結構化資料儲存格式,可以用於結構化資料序列化,很適合做資料儲存或 rpc 資料交換格式。
比json、xml效率更高,以高效的二進位制方式儲存,比 xml 小 3 到 10 倍,快 20 到 100 倍。protobuf 的程式設計模式比較友好,簡單易學。
有兩項技術保證了採用 protobuf 的程式能獲得相對於 xml 極大的效能提高:
1. protobuf 序列化後的資訊內容,資訊的表示非常緊湊。
protobuf 序列化後所生成的二進位制訊息非常緊湊,這得益於 protobuf 採用的非常巧妙的 encoding 方法。
2. protobuf 封解包的大致過程,封解包的速度。
首先我們來了解一下 xml 的封解包過程。xml 需要從檔案中讀取出字串,再轉換為 xml 文件物件結構模型。之後,再從 xml 文件物件結構模型中讀取指定節點的字串,最後再將這個字串轉換成指定型別的變數。這個過程非常複雜,其中將 xml 檔案轉換為文件物件結構模型的過程通常需要完成詞法文法分析等大量消耗 cpu 的複雜計算。
反觀 protobuf,它只需要簡單地將乙個二進位制序列,按照指定的格式讀取到程式對應的結構型別中就可以了。從上一節的描述可以看到訊息的 decoding 過程也可以通過幾個位移操作組成的表示式計算即可完成。速度非常快。
之所以結尾很倉促,是因為領導忽然說基於http的rpc會消耗大量資源,不得已轉入基於tcp的rpc框架,後續可能會有其他更新,比如基於tcp的dubbo(**的),序列化可以多種選擇,傳輸則是tcp協議,使用了高效能的nio框架netty。
gRPC學習筆記 一 gRPC簡述
rpc 遠端過程呼叫 remote procedure call 是一種通過網路從其它程序或者其他主機上的程序請求服務的方式。rpc是分布式系統的基礎。grpc是主要由google公司開發的乙個高效能 通用的開源rpc框架。grpc基於http2.0協議,基於protobuf序列化協議,語言中立 平...
grpc學習筆記
在 grpc 裡客戶端應用可以像呼叫本地物件一樣直接呼叫另一台不同的機器上服務端應用的方法,使得您能夠更容易地建立分布式應用和服務。與許多 rpc 系統類似,grpc 也是基於以下理念 定義乙個服務,指定其能夠被遠端呼叫的方法 包含引數和返回型別 在服務端實現這個介面,並執行乙個 grpc 伺服器來...
Grpc系列學習 一
以下內容出自我的個人部落格 個人部落格 grpc系列學習 一 剛開始學習go的時候就想認識go有沒有類似與springcloud的分布式框架,也是那個時候得知了grpc.說來慚愧,對grpc的認識也僅僅停留在 我知道有這麼個東西,但是我不會用.因為準備寫一系列部落格,來開始重新拾起這個分布式框架.h...