前回gRPCでサーバ側のコードを書いてみたので続いてそのサーバを呼び出すクライアント側のコードを書いてみた。
実行環境
- クライアントのコードもサーバと同じdockerコンテナで実行する
- コンテナは1つだけどdocker runのコマンドオプション指定が面倒なのでdocker-composeを使用してます
書いたコード
cmd/client/main.go
package main import ( "context" "fmt" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" memopb "grpc-memoapp/pkg/grpc" "log" "os" ) func main() { if len(os.Args) != 2 { fmt.Println("Usage: ./main.go <memoID>") return } conn, err := grpc.Dial( "grpc-memoapp:8080", // docker-composeのサービス名とポートを指定 grpc.WithTransportCredentials(insecure.NewCredentials()), // この指定がないとブロックされる grpc.WithBlock(), ) if err != nil { log.Fatalf("Failed to connect: %v", err) } defer conn.Close() client := memopb.NewMemoAPIClient(conn) id := os.Args[1] getMemoRequest := &memopb.GetMemoRequest{ Id: id, } getMemoResponse, err := client.GetMemo(context.Background(), getMemoRequest) if err != nil { log.Fatalf("Error calling GetMemo: %v", err) } fmt.Printf("GetMemo Response: %+v\n", getMemoResponse) }
上記のコードを実行するとサーバ側で定義したリクエストメソッドを呼び出せます。
docker compose run grpc-memoapp go run cmd/client/main.go 1 GetMemo Response: memo:{title:"updateDemo" description:"updateDemo"}
CreateとかUpdateとか他のメソッドも&memopb.GetMemoRequest
の箇所を書き換えれば呼べる。