這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
本文會介紹gRPC和協議緩衝。gRPC可以使用協議緩衝作為它的IDL和底層資訊交換格式。如果你剛接觸gRPC或者協議緩衝,那就看本文!如果你想深入或者實戰,查看Quick Starts。
概述
在gRPC裡,用戶端可以直接調用不同機器上的服務應用的方法,就像是本機物件一樣,所以建立分布式應用和服務就很簡單了。在很多RPC(Remote Procedure Call Protocol)系統裡,gRPC是基於定義一個服務,指定一個可以遠程調用的帶有參數和傳回型別的的方法。在服務端,服務實現這個介面並且運行gRPC服務處理用戶端調用。在用戶端,有一個stub提供和服務端相同的方法。
在各種環境裡,gRPC用戶端和服務端都能運行並且互相通訊 - 從Google內部服務到你自己的案頭 - 並且可以寫在任何gRPC支援的語言。比如,可以簡單的建立java作為gRPC的服務端,Go,Python或者Ruby作為用戶端。另外,最新的GoogleAPIs將會有gRPC版本的介面,可以方便的在應用裡構建Google功能。
使用協議緩衝
預設gRPC使用protocol buffers,Google成熟開源的序列化結構資料(儘管可以使用其他資料格式,比如JSON)。這裡有簡單的介紹他是如何工作的。如果你已經熟悉了協議緩衝,可以直接看下一章節。
使用協議緩衝的第一步是在proto file裡為資料定義你想序列化的結構:可以是普通的.proto擴充的文字檔。協議緩衝資料結構為messages,每條message是一個小的邏輯記錄的資訊包含一些name-value對名為fields。比如:
message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3;}
然後,一旦你指定了你的資料結構,使用協議緩衝解析器protoc產生資料訪問類在proto定義的語言。這些為每個欄位(比如name()和set_name())和方法序列化/解析整個結構到/從raw bytes提供了簡單的訪問器 - 比如,你選擇的語言是C++,對上面的例子運行編譯會產生一個Person類。然後就可以在應用裡使用這個類去populate,序列化和擷取Person協議緩衝messages。
你將會在樣本裡看到更詳細的定義在普通proto檔案裡的gRPC services,有RPC方法參數和指定的傳回型別作為協議緩衝messages:
// The greeter service definition.service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {}}// The request message containing the user's name.message HelloRequest { string name = 1;}// The response message containing the greetingsmessage HelloReply { string message = 1;}
gRPC同樣使用protoc和指定的gRPC外掛程式從你的proto檔案裡產生代碼。但是,使用gRPC外掛程式,你會得到產生的gRPC用戶端和服務端代碼和普通的用來populating,序列化和擷取你的訊息類型protocol buffer代碼。我們將會在下面的執行個體詳細說明。
可以在Protocol Buffers documentation查看更多的關於protocal buffers, 和如何安裝相應語言的protoc和外掛程式。
Protocol buffer versions
雖然protocal buffers有些時候對開源使用者可用,我們的樣本使用了新風格的protocal buffers,叫做proto3,有著更簡單的文法,一些有用的新特性,並且支援更多的語言。現在對以下語言可用:Java,C++,Python,Objective-C,C#,alite-runtime(Android Java),Ruby和JavaScript from theprotocol buffers Github repo,同時Go語言產生器golang/protobuf Github repo,還有更多語言在開發中。查看proto3 language guide瞭解更多,還有相關可用的每種語言的文檔,在release notes查看每個版本的區別。更多的proto3文檔還在更新中。
一般,雖然可以使用proto2(當前預設的protocal buffers版本),我們還是建議你使用proto3搭配gRPC,讓你可以使用全部的gRPC支援的語言,同時避免與proto2用戶端與proto3服務端通選的相容問題(或者proto3用戶端-proto2服務端的問題)。