Golang gRPC實踐 連載一 gRPC介紹與安裝

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

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

安裝:

  • 要求golang版本 > 1.4

  • 使用前要求安裝protocol buffer編譯器

運行:

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的編譯姿勢:

  • -I 參數:指定import路徑,可以指定多個-I參數,編譯時間按順序尋找,不指定時預設尋找目前的目錄

  • --go_out :golang編譯支援,支援以下參數

    • plugins=plugin1+plugin2 - 指定外掛程式,目前只支援grpc,即:plugins=grpc

    • M 參數 - 指定匯入的.proto檔案路徑編譯後對應的golang包名(不指定本參數預設就是.proto檔案中import語句的路徑)

    • import_prefix=xxx - 為所有import路徑添加首碼,主要用於編譯子目錄內的多個proto檔案,這個參數按理說很有用,尤其適用替代一些情況時的M參數,但是實際使用時有個蛋疼的問題導致並不能達到我們預想的效果,自己嘗試看看吧

    • import_path=foo/bar - 用於指定未聲明packagego_package的檔案的包名,最右面的斜線前的字元會被忽略

    • 末尾 :編譯檔案路徑 .proto檔案路徑(支援萬用字元)

完整樣本:

protoc -I . --go_out=plugins=grpc,Mfoo/bar.proto=bar,import_prefix=foo/,import_path=foo/bar:. ./*.proto

參考

本系列範例程式碼

  • go-grpc-example

相關文檔:

  • grpc官方文檔

  • grpc中文文檔

  • protobuf官方文檔

相關項目

  • grpc/grpc

  • grpc-go

  • grpc-java

  • google/protobuf

  • golang/protobuf

  • grpc-middleware

  • grpc-gateway

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.