Google gRPC 簡介

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。 Google gRPC 簡介

1.   簡介

      Google 剛剛開源了grpc,  一個基於HTTP2 和 Protobuf 的RPC 實現。

      其中github地址: https://github.com/grpc/grpc

      Protobuf 本身雖然提供了RPC  的定義文法,但是一直以來,Google 只開源了Protobuf 序列化還原序列化的代碼,而沒有開源RPC 的實現,於是存在著眾多良莠不齊的第三方RPC 實現。

      從實現和特性看來,grpc 更多的是考慮移動情境情況下用戶端和服務端的通訊,正如其自稱的「general RPC framework that puts mobile and HTTP/2 first」。HTTP2 本身提供了串連多工、Body 和 Header 壓縮等機制,grpc 基於此可以提供比較高效的實現。

      grpc 所使用的依賴都比較新,如protbuf 需要3.0 版本, c++ 使用了c++11, Java 實現中的netty 需要5.0  版本, HTTP2 也是剛剛定稿。這些依賴中很多都還是沒有正式release ,所以目前來看grpc 還不是一個可穩定使用的狀態。

      grpc 提供了c 、Java、golang 的原生實現,並以c 共用庫的方式來支援Node.js, Python, Ruby, Objective-C, PHP 和 C# 語言 (由此看來,c++, Java 和golang 在Google 有著一等公民的地位)。其中Java 語言的實現亦可以用於Android 用戶端,Objective-C 的實現主要針對IOS 用戶端。


2. 協議分析

     gRPC 和通常的基於TCP的實現不同,是直接基於HTTP2 協議的。HTTP2 使得gRPC 能夠更好的適用於移動用戶端和服務端通訊的使用情境,並且串連多工也保證了RPC 的效率。

      gRPC 的協議設計上很好的使用了HTTP2 現有的語義,請求和響應的資料使用HTTP Body 發送,其他的控制資訊則用Header 表示。先看個例子,假設Protobuf 定義如下:

package foo.bar;message HelloRequest {  string greeting = 1;}message HelloResponse {  string reply = 1;}service HelloService {  rpc SayHello(HelloRequest) returns (HelloResponse);}

在這裡面我們定義了一個service HelloService。grpc 為這樣一個調用發送的請求為: 

HEADERS (flags = END_HEADERS):method = POST:scheme = http:path = /foo.bar.HelloService/SayHello:authority = api.test.comgrpc-timeout = 1Scontent-type = application/grpc+protogrpc-encoding = gzipauthorization = Bearer y235.wef315yfh138vh31hv93hv8h3vDATA (flags = END_STREAM)<Delimited Message>

Http 請求的Path 部分用來表示調用哪個服務,格式是/{package}.{ServiceName}/{RpcMethodName},content-type 目前取值都是application/grpc+proto,將來gRPC 支援除Protobuf 之外的協議如Json 時,會有別的值。grpc-encoding 可以有gzip, deflate, snappy 等取值,表示採用的壓縮方法。grpc-timeout 表示調用的逾時時間,單位有Hour(H), Minute(M), Second(S), Millisecond(m), Microsecond(u), Nanosecond(n) 等。 

除了gRPC 定義的標準頭之外,也可以自己添加新的頭。如果是二進位的Header,則Header Name 以-bin 結尾,Header Value 是經過Base 64 編碼的位元據。服務端對這個請求返回一個Response:
HEADERS (flags = END_HEADERS):status = 200grpc-encoding = gzipDATA<Delimited Message>HEADERS (flags = END_STREAM, END_HEADERS)grpc-status = 0 # OKtrace-proto-bin = jher831yy13JHy3hc
grpc-status 為0 表示請求沒有出現問題,成功返回。gRPC 還定義了GOAWAY Frame, 當Server 斷開一個串連的時候,需要向用戶端發送這樣一條訊息;以及PING Frame,接受到PING Frame 後直接原樣返回資料,用於串連存活檢測和延遲檢測。HTTP2 的Header 並不是特別高效的格式,儲存上和解析上都有一些效率問題。如果啟用加密串連的話,則會有更多的效率開銷。

參考: http://www.dongliu.net/post/622451

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.