yikegaya’s blog

仕事関連(Webエンジニア)と資産運用について書いてます

GoでgRPCのクライアントコードを書いてみた

前回gRPCでサーバ側のコードを書いてみたので続いてそのサーバを呼び出すクライアント側のコードを書いてみた。

ikeyu0806.hatenablog.com

実行環境

  • クライアントのコードもサーバと同じ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の箇所を書き換えれば呼べる。