Help us understand the problem. What is going on with this article?

gRPCサーバーの動作確認をgrpcurlでやってみた

More than 1 year has passed since last update.

はじめに

gRPCサーバーの動作確認どうしよう。。。と色々調べてたどり着いたgrpcurlをご紹介。
色々機能はあるようですが、一部だけの紹介になります。

確認した環境

gRPCサーバーの構成

  • Spring Boot 1.5.10
  • grpc-spring-boot-starter 2.4.0

開発環境

  • Windows

grpcurlとは

https://github.com/fullstorydev/grpcurl
gRPCサーバーとの対話をcurlコマンドライクに実現できるツールです。
コマンドを実行するとgRPCサーバーの応答がjson形式で返ってきます。

リンク先に詳細が書かれていますのでそちらを読むだけでもいいかと思います。

なお、goのインストールが必要です。

準備(Windows編)

1. Goのインストール

ダウンロード~インストール
https://golang.org/dl/
こちらのサイトから皆さんの環境にあったものをダウンロードしてください。
Windowsの場合、インストーラーの指示に従えば特に問題なく完了できます。

設定の確認
Windowsの場合、環境変数に以下のものが追加されています。
* GOPATH:%USERPROFILE%go
* GOROOT:インストール時に指定したディレクトリ
* Path:%GOPATH%binが追加されます。

インストール確認

コマンドプロンプトでgo versionとタイプしバージョン情報が表示されればインストール完了です。

> go version

※実行できない方はコマンドプロンプトを再起動するか、システム環境変数のPathを確認しましょう。

2. grpcurlのインストール

ダウンロード~インストール

下記のコマンドを実行するだけでOKです。

> go get github.com/fullstorydev/grpcurl
> go install github.com/fullstorydev/grpcurl/cmd/grpcurl

先ほど確認した、$GOPATH 環境変数に指定した場所のbinサブフォルダにgrpcurlコマンドがインストールされます。
デフォルトであればPathには%GOPATH%binが指定されているのでコマンドプロンプトからすぐに実行できるはずです。
実行できない方はPathの指定を確認してみてください。

インストール確認

下記のコマンドが実行できればgrpcurlのインストールは完了です。

> grpcurl -help 

3. reflection の設定

gRPCサーバーでreflection機能を有効にします。
※ grpcurlではreflectionが有効ではない場合の実行方法も用意されていますが今回は割愛。:sweat_smile:

grpc-spring-boot-starterを利用している場合、application.ymlに下記の設定を追加するだけでOKです。

application.yml
grpc:
  enable-reflection: true

注意:grpc-spring-boot-starterのバージョンによっては対応していません。(2.3.2~)

starterを利用していない場合は下記の手順で行けるようです。(未確認)
https://github.com/grpc/grpc-java/blob/master/documentation/server-reflection-tutorial.md

これで準備は完了です。

TODO 準備(Mac編)

// coming soon ...

使ってみる

動作確認する対象のgRPCサーバーを起動しておきます。

サービス一覧を表示

> grpcurl -plaintext localhost:6565 list

-plaintext
 plain-textモードで動作確認ができます。
 省略するとTLSで確認できます。

localhost:6565
 gRPCサーバーのホスト名とポート番号を指定します。

実行すると、下記のようにサーバー側にあるサービス一覧が表示されます。

実行結果
> grpcurl -plaintext localhost:6565 list
helloworld.HelloWorldService
goodbyeworld.GoodByeWorldService
grpc.health.v1.Health
grpc.reflection.v1alpha.ServerReflection

メソッド一覧の表示

> grpcurl -plaintext localhost:6565 list helloworld.HelloWorldService

helloworld.HelloWorldService
 サービス一覧を取得するコマンドの後ろにサービス名を指定します。

実行結果
> grpcurl -plaintext localhost:6565 list helloworld.HelloWorldService
Greeting

サービスの呼び出し

> grpcurl -plaintext localhost:6565 helloworld.HelloWorldService/Greeting

helloworld.HelloWorldService/Greeting
 一覧で確認したサービス名/メソッド名を指定します。

実行すると結果がjson形式で表示されます。

実行結果
> grpcurl -plaintext localhost:6565 helloworld.HelloWorldService/Greeting
{
  "message": "Hello World!"
}

サービスの呼び出し(リクエストパラーメータあり)

> grpcurl -plaintext -d '{"lang":"Java"}' localhost:6565 helloworld.HelloWorldService/Greeting

-dの後にjson形式でパラメータを記載すればいい。
と、サイトには書かれていたのですが、シングルクォートが怒られたりとうまく動きませんでした:cold_sweat:
そこで。。。

> grpcurl -plaintext -d @ localhost:6565 helloworld.HelloWorldService/Greeting

-dのあとに'@'を指定することでSTDINでパラメータを入力できる、という方法が紹介されていたのでこちらを試しました。

> grpcurl -plaintext -d @ localhost:6565 helloworld.HelloWorldService/Greeting
{
  "lang": "Java"
}
EOM

EOM
 WindowsではCtrl+Z、Unix系ではCtrl+Dで入力できます。
 Windowsのコマンドプロンプトでは^Zで表示されます。

実行すると見事に結果が返ってきました。:relaxed:

実行結果
> grpcurl -plaintext -d @ localhost:6565 helloworld.HelloWorldService/Greeting
{
  "lang": "Java"
}
^Z
{
  "message": "Hello Java World!"
}

おまけ

結果をファイル出力したい場合はこんな感じ。

grpcurl -plaintext localhost:6565 helloworld.HelloWorldService/Greeting > GreetingResult.json
GreetingResult.json
{
  "message": "Hello World!"
}

おわり

yukina-ge
基本Javaの案件ばかりやってます。 今はお仕事でAWSをつかった動画配信コンテンツを作っています。
genuine
確かな技術力と誠実な人間力、ユーザー目線の業務スキルで本当に必要とされるシステムを構築する会社です。
https://genuine-pt.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした