生成コードリファレンス
生成コードリファレンス
このページでは、protoc
で.proto
ファイルをコンパイルする際に、grpcプラグイン、protoc-gen-go-grpc
で生成されるコードについて説明します。
.proto
ファイルでgRPCサービスを定義する方法については、サービス定義を参照してください。
スレッドセーフ:クライアント側のRPC呼び出しとサーバー側のRPCハンドラーはスレッドセーフであり、並行するゴルーチンで実行されることを意図していることに注意してください。ただし、個々のストリームの場合、入出力データは双方向ですがシリアルであることに注意してください。したがって、たとえば、個々のストリームは同時読み取りまたは同時書き込みをサポートしていません(ただし、読み取りは書き込みと安全に同時実行できます)。
生成されたサーバーインターフェースのメソッド
サーバー側では、.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
は1回だけ呼び出す必要があることに注意してください。
双方向ストリーミングメソッド
これらのメソッドは、生成されたサービスインターフェースで次のシグネチャを持ちます。
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
ファイルに存在します)。
単項メソッド
これらのメソッドは、生成されたクライアントスタブで次のシグネチャを持ちます。
(ctx context.Context, in *MsgA, opts ...grpc.CallOption) (*MsgB, error)
このコンテキストでは、MsgA
はクライアントからサーバーへの単一のリクエストであり、MsgB
にはサーバーから返信された応答が含まれています。
サーバー側のストリーミングメソッド
これらのメソッドは、生成されたクライアントスタブで次のシグネチャを持ちます。
Foo(ctx context.Context, in *MsgA, opts ...grpc.CallOption) (<ServiceName>_FooClient, error)
このコンテキストでは、<ServiceName>_FooClient
はMsgB
メッセージのサーバーからクライアントへのストリーム
を表します。
このストリームには、grpc.ClientStream
と以下のインターフェースが組み込まれています。
type <ServiceName>_FooClient interface {
Recv() (*MsgB, error)
grpc.ClientStream
}
クライアントがスタブでFoo
メソッドを呼び出すと、ストリームが開始されます。次に、クライアントは、返された<ServiceName>_FooClient
ストリームでRecv
メソッドを繰り返し呼び出して、サーバーからクライアントへの応答ストリームを読み取ることができます。このRecv
メソッドは、サーバーからクライアントへのストリームが完全に読み取られると、(nil, io.EOF)
を返します。
クライアント側のストリーミングメソッド
これらのメソッドは、生成されたクライアントスタブで次のシグネチャを持ちます。
Foo(ctx context.Context, opts ...grpc.CallOption) (<ServiceName>_FooClient, error)
このコンテキストでは、<ServiceName>_FooClient
はMsgA
メッセージのクライアントからサーバーへのストリーム
を表します。
<ServiceName>_FooClient
には、grpc.ClientStream
と以下のインターフェースが組み込まれています。
type <ServiceName>_FooClient interface {
Send(*MsgA) error
CloseAndRecv() (*MsgB, error)
grpc.ClientStream
}
クライアントがスタブでFoo
メソッドを呼び出すと、ストリームが開始されます。次に、クライアントは、返された<ServiceName>_FooClient
ストリームでSend
メソッドを繰り返し呼び出して、クライアントからサーバーへのメッセージストリームを送信できます。このストリームのCloseAndRecv
メソッドは、クライアントからサーバーへのストリームを閉じて、サーバーから単一の応答メッセージを受信するために、1回だけ呼び出す必要があります。
双方向ストリーミングメソッド
これらのメソッドは、生成されたクライアントスタブで次のシグネチャを持ちます。
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
}
クライアントがスタブでFoo
メソッドを呼び出すと、ストリームが開始されます。次に、クライアントは、返された<SericeName>_FooClient
ストリームでSend
メソッドを繰り返し呼び出して、クライアントからサーバーへのメッセージストリームを送信できます。クライアントは、このストリームでRecv
を繰り返し呼び出して、サーバーからクライアントへのメッセージストリーム全体を受信することもできます。
サーバーからクライアントへのストリームの終端は、ストリームのRecv
メソッドでの(nil, io.EOF)
の戻り値によって示されます。クライアントからサーバーへのストリームの終端は、クライアントがストリームのCloseSend
メソッドを呼び出すことによって示すことができます。
パッケージと名前空間
protoc
コンパイラが--go_out=plugins=grpc:
で呼び出されると、proto package
からGoパッケージへの変換は、protoc-gen-go
プラグインがgrpc
プラグインなしで使用される場合と同じように機能します。
したがって、たとえば、foo.proto
がpackage foo
にあると宣言した場合、生成されたfoo.pb.go
ファイルもGoのpackage foo
になります。