產生程式碼(舊版非泛型)參考

產生程式碼(舊版非泛型)參考

此頁面說明使用 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 中。

上次修改日期為 2024 年 11 月 12 日:generated-code: update to include stream generics (#1365) (3df8b27)