這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
gRPC介紹與安裝
A high performance, open source, general RPC framework that puts mobile and HTTP/2 first. ——gRPC Website
gRPC 是一個高效能、開源、通用的RPC架構,由Google推出,基於HTTP/2協議標準設計開發,預設採用Protocol Buffers資料序列化協議,支援多種開發語言。gRPC提供了一種簡單的方法來精確的定義服務,並且為用戶端和服務端自動產生可靠的功能庫。
主要特性
強大的IDL
gRPC使用ProtoBuf來定義服務,ProtoBuf是由Google開發的一種資料序列化協議(類似於XML、JSON、hessian)。ProtoBuf能夠將資料進行序列化,並廣泛應用在資料存放區、通訊協定等方面。
多語言支援
gRPC支援多種語言,並能夠基於語言自動產生用戶端和服務端功能庫。目前已提供了C版本grpc、Java版本grpc-java 和 Go版本grpc-go,其它語言的版本正在積極開發中,其中,grpc支援C、C++、Node.js、Python、Ruby、Objective-C、PHP和C#等語言,grpc-java已經支援Android開發。
HTTP/2
gRPC基於HTTP/2標準設計,所以相對於其他RPC架構,gRPC帶來了更多強大功能,如雙向流、頭部壓縮、多複用請求等。這些功能給行動裝置帶來重大益處,如節省頻寬、降低TCP連結次數、節省CPU使用和延長電池壽命等。同時,gRPC還能夠提高了雲端服務和Web應用的效能。gRPC既能夠在用戶端應用,也能夠在伺服器端應用,從而以透明的方式實現用戶端和伺服器端的通訊和簡化通訊系統的構建。
在gRPC用戶端可以直接調用不同伺服器上的遠程程式,使用姿勢看起來就像調用本地程式一樣,很容易去構建分布式應用和服務。和很多RPC系統一樣,服務端負責實現定義好的介面並處理用戶端的請求,用戶端根據介面描述直接調用需要的服務。用戶端和服務端可以分別使用gRPC支援的不同語言實現。
grpc庫與protobuf
預設需要單獨編譯安裝grpc與protobuf編譯器,grpc/homebrew-grpc項目提供了快速安裝指令碼,可以直接安裝grpc、protobuf編譯器及其它語言編譯需要的外掛程式。go語言外掛程式需要獨立安裝。
準備工作
Linux系統安裝 linuxbrew
MAC OS X系統安裝 homebrew
安裝
指令碼安裝
curl -fsSL https://goo.gl/getgrpc | bash -s -- --with-plugins
或者直接使用brew安裝:
brew tap grpc/grpcbrew install --with-plugins grpc
安裝結果:
/usr/local/binprotocgrpc_cpp_plugingrpc_node_plugingrpc_python_plugingrpc_csharp_plugingrpc_objective_c_plugingrpc_ruby_plugin
這種安裝方式會安裝gRPc C/C++庫和其它支援語言的proto外掛程式和protobuf編譯器。如果用不到這些語言,可以只安裝protobuf就好了,參考項目:protobuf。java和go支援有獨立項目grpc-java和grpc-go。
Golang protobuf外掛程式
項目地址:golang/protobuf
安裝:
運行:
go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
編譯後會安裝protoc-gen-go到$GOBIN目錄, 預設在 $GOPATH/bin. 該目錄必須在系統的環境變數$PATH中,這樣在編譯.proto檔案時protocol編譯器才能找到外掛程式。
grpc-go
# 如果需要翻牆自己解決吧go get -u google.golang.org/grpc
編譯器使用
使用protoc命令編譯.proto檔案,不同語言支援需要指定輸出參數,如:
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --javanano_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto
這裡詳細介紹golang的編譯姿勢:
完整樣本:
protoc -I . --go_out=plugins=grpc,Mfoo/bar.proto=bar,import_prefix=foo/,import_path=foo/bar:. ./*.proto
參考
本系列範例程式碼
相關文檔:
grpc官方文檔
grpc中文文檔
protobuf官方文檔
相關項目
grpc/grpc
grpc-go
grpc-java
google/protobuf
golang/protobuf
grpc-middleware
grpc-gateway