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#支援。
php入門到就業線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API偵錯工具:
本教學操作環境: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語言嗎的詳細內容,更多請關注TW511.COM其它相關文章!
<script type="text/javascript" src="https://sw.php.cn/hezuo/43cc2463da342d2af2696436bd2d05f4.html?bottom" ></script>