はじめに
gRPCを用いたエンドポイントとリクエスト、レスポンスデータのセットの備忘記録です。
例えばSample/GetDataというエンドポイントを通じてクライアントからのリクエストを受け取り、適切なレスポンスを返すプロセスを実装例を記載します。
環境構築
以下を参考に環境を作りました。(非常に簡易に作れる)
今回試すファイルを修正と対応
ファイル構成
.
├── client
│ └── main.go
├── go.mod
├── go.sum
├── grpc_sample
│ ├── sample.pb.go
│ └── sample_grpc.pb.go
├── proto
│ └── sample.proto
└── server
└── main.go
proto/sample.goを以下のように記載
syntax = "proto3";
package sample;
option go_package = "../grpc_sample";
// リクエストメッセージに新しいフィールドを追加します。
message GetDataRequest {
string num_type = 1;
}
// ユーザーデータ型を定義します。
message UserData {
string user_id = 1;
string user_name = 2;
}
// レスポンスメッセージに新しいフィールドを追加します。
message GetDataResponse {
repeated UserData user_datas = 1;
int32 num_max = 2;
}
service SampleService {
// リクエストとレスポンスメッセージの型を更新します。
rpc GetData(GetDataRequest) returns (GetDataResponse) {}
}
protoファイルがある場所で以下を実行
protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. sample.proto
server/main.goを以下のように記載。
responseでデータをセットしています。
package main
import (
"log"
"net"
"github.com/example/grpc_sample"
"golang.org/x/net/context"
"google.golang.org/grpc"
)
func main() {
log.Print("main start")
// 9000番ポートでクライアントからのリクエストを受け付けるようにする
listen, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
grpcServer := grpc.NewServer()
// Sample構造体のアドレスを渡すことで、クライアントからGetDataリクエストされると
// GetDataメソッドが呼ばれるようになる
grpc_sample.RegisterSampleServiceServer(grpcServer, &Sample{})
// 以下でリッスンし続ける
if err := grpcServer.Serve(listen); err != nil {
log.Fatalf("failed to serve: %s", err)
}
log.Print("main end")
}
type Sample struct {
name string
}
func (s *Sample) GetData(
ctx context.Context,
req *grpc_sample.GetDataRequest, // リクエストの型を更新します。
) (*grpc_sample.GetDataResponse, error) { // レスポンスの型を更新します。
log.Print("Received num_type: ", req.NumType)
// ここでuser_datasとnum_maxを設定します。
userDatas := []*grpc_sample.UserData{
// ここにユーザーデータを追加します。
{UserId: "1", UserName: "ユーザー1"},
{UserId: "2", UserName: "ユーザー2"},
// ...
}
numMax := int32(len(userDatas)) // 例として、userDatasの長さをnum_maxとしています。
// レスポンスを作成して返します。
response := &grpc_sample.GetDataResponse{
UserDatas: userDatas,
NumMax: numMax,
}
return response, nil
}
server/main.goを実行
(serverフォルダにて実行)
go run main.go
結果確認
PostManで確認
以下より、main.goの実行に成功し、Sample/GetDataエンドポイントを介してクライアントからのリクエストを受け取り、適切なレスポンスを返すことが確認できました。
リクエストはコマンドのメッセージにて確認
2024/03/24 17:23:01 main start
2024/03/24 17:23:08 Received num_type: Lorem consectetur do
2024/03/24 17:23:28 Received num_type: Lorem consectetur do
2024/03/24 17:24:39 Received num_type: 3
おわりに
gRPCは最初色々とっつきにくいですが、エンドポイント、リクエスト、レスポンスをどうセットするのかから確認しました。
参考記事