grpc不是只支援go語言。 grpc是通訊協定基於HTTP/2,支援多語言的RPC框架;目前提供C、Java和Go語言版本,分別是grpc、grpc-java、grpc-go;其中C版本支援C、C 、Node.js、 Python、Ruby、Objective-C、PHP和C#支援。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
什麼是grpc
gRPC 是通訊協定基於 HTTP/2,支援多語言的 RPC 框架,以行動和 HTTP/2 設計為導向。 gRPC 基於 HTTP/2 標準設計,帶來諸如雙向流、流控、頭部壓縮、單一 TCP 連線上的多重使用請求等特。這些特性使得其在行動裝置上表現更好,更省電和節省空間佔用。
RPC:Remote Procedure Call 的縮寫,譯為遠端過程呼叫(也可翻譯為遠端方法呼叫或遠端呼叫),它是電腦通訊協定。該協定可以實現呼叫遠端服務就像呼叫本地服務一樣簡單,無需關心跨網絡,跨平台,跨語言等問題。
gRPC 訊息序列化方式通常使用 Protobuf,它是二進位格式,體積小,網路傳輸快,佔用頻寬流量少,呼叫效能更高。
gRPC 的特性
-
IDL
gRPC使用ProtoBuf 來定義服務,ProtoBuf 是由Google 開發的資料序列化協定(類似XML、JSON)。 ProtoBuf 能夠將資料進行序列化,並廣泛應用在資料儲存、通訊協定等方面。
-
多語言支援
gRPC 支援多種語言,並且能夠基於語言自動產生客戶端和服務端功能庫。目前已提供了C 版本grpc、Java 版本grpc-java 和Go 版本grpc-go,其中,grpc 支援C、C 、Node.js、Python、Ruby、Objective-C、PHP 和C# 等語言,grpc-java 已經支援Android 開發。
-
HTTP2
gRPC基於HTTP2標準設計,帶來了更多強大功能,如雙向流、頭部壓縮、多重使用請求等。這些功能帶來重大益處,如節省頻寬、降低TCP連結次數、節省CPU使用和延長電池壽命等。同時,gRPC也能夠提升了雲端服務和Web應用的效能。 gRPC既能夠在客戶端應用,也能夠在伺服器端應用,從而以透明的方式實現客戶端和伺服器端的通訊和簡化通訊系統的建置。
為什麼我們要用grpc
生態好:背靠Google。還有例如nginx也對grpc提供了支持,參考連結
跨語言:跨語言,且自動產生sdk
效能高:例如protobuf效能高過json, 例如http2.0效能高過http1.1
強型別:編譯器就給你解決了很大一部分問題
串流處理(基於http2.0):支援客戶端流式,服務端串流式,雙向串流
grpc 的優點是怎麼實現的
1、grpc效能高:protobuf為什麼比json效能高?
1)什麼是protobuf?
- Protobuf是由Google開發的二進位格式,用於在不同服務之間序列化資料。是一種IDL(interface description language)語言
2)他比json快多少?
3)為什麼protobuf比json快?
- 比較json資料和protobuf資料格式可以知道
-
#體積小-無分隔符號:TLV儲存方式不需要分隔符號(逗號,雙引號等)就能分隔字段,減少了分隔符號的使用
-
體積小-空字段省略:若字段沒有被設置字段值,那麼該字段序列化時的數據是完全不存在的,即不需要進行編碼,而json會傳key和空值的value
-
#體積小-tag二進位表示:是用字段的數字值然後轉換成二進位進行表示的,比json的key用字串表示更加省空間
-
編解碼快:tag的內部儲存了欄位的類型,可以直接知道value的長度,或者當value是字串的時候,則用length儲存了長度,可以直接從length後取n個位元組就是value的值,而如果不知道value的長度,我們就必須要做字串匹配
-
細化了解protobuf的編碼可以去看:varint 和zigzag編碼方式
2、grpc效能高:http2.0為什麼比http1.1效能高?
1)多路復用
-
#http2.0和http 1.* 還有http1.1pipling的比較
示意圖
-
http/1.* :一次請求,一個回應,建立一個連線用完關閉,每個請求都要建立一個連線
-
#http1.1 pipeling: Pipeling解決方式為,若干個請求排隊串行化單線程處理,後面的請求等待前面請求的返回才能獲得執行機會,一旦有某請求超時等,後續請求只能被阻塞,毫無辦法,也就是人們常說的線頭阻塞
-
#http2: 多個請求可同時在一個連線上並行執行。某個請求任務耗時嚴重,不會影響到其它連接的正常執行
- grpc 多路復用還有哪些優點
- 減少了tcp的連接,降低了服務端和客戶端對於內存,cpu等的壓力
- 減少了tcp的連接,保證了不頻繁觸發tcp重新建立,這樣就不會頻繁有慢啟動
- 減少了tcp的連接,使網路擁塞情況得以改善
- 為什麼http/1.1不能實現多路復用而http2.0可以?
- 因為http/1.1傳輸是用的文本,而http2.0用的是二進位分幀傳輸
##2)頭部壓縮
- 固定欄位壓縮:http可以透過http對body進行gzip壓縮,這樣可以節省頻寬,但封包中header也有很多欄位沒有進行壓縮,例如cookie, user agent accept,這些有必要進行壓縮
- 避免重複:大量請求和回應的封包裡面又很多欄位值是重複的,所以有必要避免重複性
- 編碼改進:字段是ascii編碼,效率低,改成二進位編碼可以提高
以上透過- HPACK演算法來實現,演算法主要包含三個部分
靜態字典:將常用的header欄位整成字典,例如{":method":"GET"} 就可以用單一數字2來表示- 動態字典:沒有在靜態字典裡面的一些頭部字段,則用動態字典
- Huffman 編碼: 壓縮編碼
-
#3)二進位分幀
在二進位分幀層上,HTTP 2.0 會將所有傳輸的資訊分割為更小的消息和幀,並對它們採用二進位格式的編碼,其中HTTP1.x的首部資訊會被封裝到Headers幀,而我們的request body則封裝到Data幀裡面。 - 這樣分幀以後這些幀就可以亂序發送,然後根據每個幀首部的流標識符號進行組裝
-
- 對比http/1.1因為是基於文本以換行符號分割每一key:value則會有以下問題:
一次只能處理一個請求或回應,因為這種以分隔符號分割訊息的數據,在完成之前不能停止解析- 解析這種資料無法預知需要多少內存,會給服務端有很大壓力
-
#4)伺服器主動推送資源
- 由於支援伺服器主動推送資源,則可以省去一部分請求。例如你需要兩個檔案1.html,1.css,如果是http1.0則需要請求兩次,服務端回傳兩次。但是http2.0則可以客戶端請求一次,然後服務端直接回吐兩次
更多程式相關知識,請造訪:程式設計入門! !
以上是grpc只支援go語言嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!