grpcurl を試してみた。

こんにちは、k-jun です。今週も一週間のうちに見つけた library 及びネタ帳に溜まっている library を試していこうと思います。 フラフラと github をさまよっているうちにリストがだいぶ太ってきました。時間を見つけて消費していきたいです!

grpcurl

https://github.com/fullstorydev/grpcurl

curl 形式で grpc サーバーを debug できるツールです。確かに grpc server って debug がかなりめんどくさいんですよね。 自分の中で、テストコードでテストして実際の検証はしていません! があるあるになっています。

サクッとかんたんな todo アプリの grpc server を作ってみて、試していきます。 https://github.com/k-jun/playground-grpc

中身の実装はこんな感じ。

syntax = "proto3";

option go_package = "github.com/k-jun/grpc";

// https://developers.google.com/protocol-buffers/docs/proto3
// package northpole;

service PlaygroundGrpc {
  rpc CreateTodo(TodoData) returns (TodoData) {}
  rpc ReadTodo(TodoData) returns (TodoData) {}
  rpc UpdateTodo(TodoData) returns (TodoData) {}
  rpc DeleteTodo(TodoData) returns (TodoData) {}
}

message TodoData {
  string id = 1;
  string title = 2;
  string body = 3;
}

grpcurl はサーバーリフレクションと呼ばれる要件を実装していないと、諸々の追加機能 (Service の一覧表示) が使えないので、忘れず適用しておきます。 https://github.com/grpc/grpc-go/blob/master/Documentation/server-reflection-tutorial.md#enable-server-reflection

叩いてみる。

~ grpcurl -plaintext localhost:8080 list
PlaygroundGrpc
grpc.reflection.v1alpha.ServerReflection

サービスらしきものが取れている。諸々の情報を参考にすると、/Methodを追加で付与すると行けそうなので、実行してみる。

~ grpcurl -d '{"id": "1", "title": "homework", "body": "submit at 2021-06-13"}' --plaintext localhost:8080 PlaygroundGrpc/CreateTodo
{
  "id": "1",
  "title": "homework",
  "body": "submit at 2021-06-13"
}

いけてそう。

~ grpcurl -d '{"id": "1"}' --plaintext localhost:8080 PlaygroundGrpc/ReadTodo                    {
  "id": "1",
  "title": "homework",
  "body": "submit at 2021-06-13"
}

Cache に保存した値が帰ってくることを確認。

Update

~ grpcurl -d '{"id": "1", "title": "homework", "body": "submit at 2021-06-14"}' --plaintext localhost:8080 PlaygroundGrpc/UpdateTodo
{
  "id": "1",
  "title": "homework",
  "body": "submit at 2021-06-14"
}
~ grpcurl -d '{"id": "1"}' --plaintext localhost:8080 PlaygroundGrpc/ReadTodo                    {
  "id": "1",
  "title": "homework",
  "body": "submit at 2021-06-14"
}

Delete

~ grpcurl -d '{"id": "1"}' --plaintext localhost:8080 PlaygroundGrpc/DeleteTodo
{
  "id": "1"
}
~ grpcurl -d '{"id": "1"}' --plaintext localhost:8080 PlaygroundGrpc/ReadTodo
ERROR:
  Code: Unknown
  Message: not found

全部問題ない。これはかなり便利ですね...。 次回 grpc の開発をする際には使っていこうと思います。それではでは。