產生程式碼(舊版非泛型)參考
產生程式碼(舊版非泛型)參考
此頁面說明使用 grpc 外掛程式 protoc-gen-go-grpc
編譯含有 protoc
的 .proto
檔案時所產生的程式碼。
您可以在服務定義中了解如何在 .proto
檔案中定義 gRPC 服務。
執行緒安全:請注意,用戶端 RPC 呼叫和伺服器端 RPC 處理常式是執行緒安全的,並且應該在並行 goroutine 上執行。但也要注意,對於個別串流,傳入和傳出的資料是雙向但循序的;因此,例如,個別串流不支援並行讀取或並行寫入(但讀取與寫入同時是安全並行的)。
產生伺服器介面上的方法
在伺服器端,.proto
檔案中的每個 service Bar
都會產生函數
func RegisterBarServer(s *grpc.Server, srv BarServer)
應用程式可以定義 BarServer
介面的具體實作,並使用此函數將其註冊到 grpc.Server
執行個體(在啟動伺服器執行個體之前)。
一元方法
這些方法在產生的服務介面上具有以下簽名
Foo(context.Context, *MsgA) (*MsgB, error)
在此內容中,MsgA
是從用戶端傳送的 protobuf 訊息,而 MsgB
是從伺服器傳回的 protobuf 訊息。
伺服器串流方法
這些方法在產生的服務介面上具有以下簽名
Foo(*MsgA, <ServiceName>_FooServer) error
在此內容中,MsgA
是來自用戶端的單一請求,而 <ServiceName>_FooServer
參數表示從伺服器到用戶端的 MsgB
訊息串流。
<ServiceName>_FooServer
具有內嵌的 grpc.ServerStream
和以下介面
type <ServiceName>_FooServer interface {
Send(*MsgB) error
grpc.ServerStream
}
伺服器端處理常式可以透過此參數的 Send
方法向用戶端傳送 protobuf 訊息串流。伺服器到用戶端串流的結束是由處理常式方法的 return
引起的。
用戶端串流方法
這些方法在產生的服務介面上具有以下簽名
Foo(<ServiceName>_FooServer) error
在此內容中,<ServiceName>_FooServer
可用於讀取用戶端到伺服器訊息串流,並傳送單一伺服器回應訊息。
<ServiceName>_FooServer
具有內嵌的 grpc.ServerStream
和以下介面
type <ServiceName>_FooServer interface {
SendAndClose(*MsgA) error
Recv() (*MsgB, error)
grpc.ServerStream
}
伺服器端處理常式可以重複呼叫此參數上的 Recv
,以便接收來自用戶端的完整訊息串流。一旦到達串流結尾,Recv
會傳回 (nil, io.EOF)
。來自伺服器的單一回應訊息是透過呼叫此 <ServiceName>_FooServer
參數上的 SendAndClose
方法傳送的。請注意,SendAndClose
必須呼叫一次且僅一次。
雙向串流方法
這些方法在產生的服務介面上具有以下簽名
Foo(<ServiceName>_FooServer) error
在此內容中,<ServiceName>_FooServer
可用於存取用戶端到伺服器訊息串流和伺服器到用戶端訊息串流。<ServiceName>_FooServer
具有內嵌的 grpc.ServerStream
和以下介面
type <ServiceName>_FooServer interface {
Send(*MsgA) error
Recv() (*MsgB, error)
grpc.ServerStream
}
伺服器端處理常式可以重複呼叫此參數上的 Recv
,以便讀取用戶端到伺服器訊息串流。一旦到達用戶端到伺服器串流結尾,Recv
會傳回 (nil, io.EOF)
。回應伺服器到用戶端訊息串流是透過重複呼叫此 ServiceName>_FooServer
參數上的 Send
方法傳送的。伺服器到用戶端串流的結束是由雙向方法處理常式的 return
指示的。
產生用戶端介面上的方法
對於用戶端使用,.proto
檔案中的每個 service Bar
也會產生函數:func BarClient(cc *grpc.ClientConn) BarClient
,它會傳回 BarClient
介面的具體實作(這個具體實作也存在於產生的 .pb.go
檔案中)。
一元方法
這些方法在產生的用戶端 stub 上具有以下簽名
(ctx context.Context, in *MsgA, opts ...grpc.CallOption) (*MsgB, error)
在此內容中,MsgA
是從用戶端到伺服器的單一請求,而 MsgB
包含從伺服器傳回的回應。
伺服器串流方法
這些方法在產生的用戶端 stub 上具有以下簽名
Foo(ctx context.Context, in *MsgA, opts ...grpc.CallOption) (<ServiceName>_FooClient, error)
在此內容中,<ServiceName>_FooClient
表示從伺服器到用戶端的 MsgB
訊息 stream
。
此串流具有內嵌的 grpc.ClientStream
和以下介面
type <ServiceName>_FooClient interface {
Recv() (*MsgB, error)
grpc.ClientStream
}
當用戶端在 stub 上呼叫 Foo
方法時,串流開始。然後,用戶端可以重複呼叫傳回的 <ServiceName>_FooClient
串流上的 Recv
方法,以便讀取伺服器到用戶端回應串流。一旦伺服器到用戶端串流已完全讀取完畢,此 Recv
方法會傳回 (nil, io.EOF)
。
用戶端串流方法
這些方法在產生的用戶端 stub 上具有以下簽名
Foo(ctx context.Context, opts ...grpc.CallOption) (<ServiceName>_FooClient, error)
在此內容中,<ServiceName>_FooClient
表示從用戶端到伺服器的 MsgA
訊息 stream
。
<ServiceName>_FooClient
具有內嵌的 grpc.ClientStream
和以下介面
type <ServiceName>_FooClient interface {
Send(*MsgA) error
CloseAndRecv() (*MsgB, error)
grpc.ClientStream
}
當用戶端在 stub 上呼叫 Foo
方法時,串流開始。然後,用戶端可以重複呼叫傳回的 <ServiceName>_FooClient
串流上的 Send
方法,以便傳送用戶端到伺服器訊息串流。必須呼叫此串流上的 CloseAndRecv
方法一次且僅一次,以便關閉用戶端到伺服器串流並接收來自伺服器的單一回應訊息。
雙向串流方法
這些方法在產生的用戶端 stub 上具有以下簽名
Foo(ctx context.Context, opts ...grpc.CallOption) (<ServiceName>_FooClient, error)
在此內容中,<ServiceName>_FooClient
表示用戶端到伺服器和伺服器到用戶端的訊息串流。
<ServiceName>_FooClient
具有內嵌的 grpc.ClientStream
和以下介面
type <ServiceName>_FooClient interface {
Send(*MsgA) error
Recv() (*MsgB, error)
grpc.ClientStream
}
當客戶端在 stub 上呼叫 Foo
方法時,串流便會開始。接著,客戶端可以重複呼叫返回的 <SericeName>_FooClient
串流上的 Send
方法,以便傳送客戶端至伺服器的訊息串流。客戶端也可以重複呼叫此串流上的 Recv
方法,以便接收完整的伺服器至客戶端的訊息串流。
伺服器至客戶端串流的結束是以串流的 Recv
方法回傳值為 (nil, io.EOF)
來表示。客戶端至伺服器串流的結束可以由客戶端呼叫串流上的 CloseSend
方法來表示。
套件和命名空間
當使用 --go_out=plugins=grpc:
參數來調用 protoc
編譯器時,proto package
到 Go package 的轉換方式與未使用 grpc
外掛程式的 protoc-gen-go
外掛程式時相同。
因此,舉例來說,如果 foo.proto
宣告其位於 package foo
中,則產生的 foo.pb.go
檔案也會位於 Go 的 package foo
中。