這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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