タケハタのブログスマートフォン用の表示で見るタケハタのブログプログラマの生き方、働き方、技術について雑多に書いていくブログです。〜1プロジェクト作成から起動確認まで〜今回からサーバーサイドKotlinでのgRPCの使用方法について、何回かに分けて書いていこうと思います。2019に登壇することもあり、復習がてら。(実際に登壇で話す内容とは異なります)cedec.cesa.or.jp「ちょっと触ってみよう」という人の手助けにもなれば。Buffersを使用し、ハイパフォーマンスな通信を実現しています。grpc.ioまだまだ国内での事例は少ないですが、GraphQLとともにRESTの次の通信の技術として注目されています。参考資料この記事の中でも出てくる、grpc-spring-boot-starter、protobuf-gradle-pluginのドキュメントを参考に作っています。サンプルコードも、主にgrpc-spring-boot-starterの内容をほぼそのまま使っています。実際にサーバーアプリケーションを作っていきます。いくつか手順があるので、順に説明します。Bootのプロジェクトを作成してください。Starter」を追加しておいてください。Buffers」を使用します。Buffersは、「protoファイル」と呼ばれる定義ファイルに通信のインターフェースを記述します。いうディレクトリを作り「Greeter.proto」という名前で下記のファイルを作成してください。1;}このprotoファイルを元に通信に必要なコード(データのシリアライズ、デシリアライズなど)を、C++、C#、Dart、Go、Java、Pythonといった様々な言語で生成することができます。それぞれの記述の意味は下記になります。message通信時のデータのやり取りで使用するデータの定義です。REST通信でもよくあるリクエスト、レスポンスのインターフェース、またその中でプロパティとして使用するオブジェクトなどが定義できます。このサンプルではシンプルに、リクエストのオブジェクト(HelloRequest)に「name」、レスポンスのオブジェクト(HelloReply)に「message」をいずれもstring型で定義しているだけになります。書いていますが、protoファイルにはフィールドの順序を指定する必要があり、その数値になります。今回は1つずつしかないためいずれも「1」が指定されていますが、2つ以上存在する場合は下記のように連番で数値を指定します。BootでのREST通信でいうControllerのような部分です。関数名とともに、受け取るリクエスト、レスポンスの型を記述します。定義した型を設定します。Buffersのバージョンです。ここでは3系を指定していますが、なにも記述しないとデフォルトでは2系と判断され、この構文ではエラーになってしまいます。指定しているのは、自動生成クラスの出力先パッケージです。他にも様々な指定できる項目があるので、また別の記事で紹介したいと思います。次に、build.gradleの設定を変更します。外し、いくつかの記述を変更してGroovyへ変換して使用してください。"$projectDir/src/"}いくつかポイントがあるので、コード上に記述しているコメントに合わせて紹介します。Buffersを扱うためのプラグインの追加です。前述のprotoファイルからコードの自動生成などを、Gradleタスクとして実行するために必要です。Bootで簡単にgRPCを使うことができるようになります。下記の記述で依存関係を追加しています。compile("io.github.lognet:grpc-spring-boot-starter:3.3.0")使い方、実装方法に関しては後述します。前述のGradleプラグインを使い、protoファイルからコードを自動生成するための設定です。いうブロックの中に記述します。BuffersのコードジェネレータはKotlinに対応していないため、Javaで生成します。自動生成のコードは手動でいじらないため、Javaのままでも(本当はKotlinにしたいけど)一旦は使えるということで。コードの自動生成実行するタスクになります。使用するライブラリ、バージョンを指定しています。Centralから取得したprotocを使用していますが、下記のようにローカルに配置したprotocのパスを指定することもできます。コード生成に使用するプラグインを定義します。これは簡単に言うと、protocでの自動生成のコードを、gRPCで使うためのコードを一緒に生成してくれるようなものと思ってください。具体的には、後ほど実際に生成されたコードを説明する際に、一緒に紹介します。このプラグインを使うために、下記の設定が必要です。プラグインを呼び出すように設定しています。最後に、自動生成の出力先の設定として、下記を記述しています。ディレクトリに出力されます。javaプラグインの参照先に追加します。両方にあるJavaファイルをコンパイルしてくれるようになります。タスクを実行してください。いうファイルが作成されます。パッケージに作られています。ディレクトリに出力されます。前述しましたが、GreeterOuterClassがこの「protocのデフォルトで作られるコード」になります。中身の紹介は省きますが、ここで先程protoファイルで定義したservice、messageを実装したコードが含まれます。GreeterGrpcは「grpcプラグインによって作られるコード」になり、GreeterOuterClassを使用してgRPCの通信部分を実装するためのクラスになります。Buffers」に関する部分で、それを「gRPC」で使うためのコードを生成するのがgRPCプラグインだと思ってください。Serviceの実装、起動では、いよいよ自動生成したコードを使って実装します。(やっとKotlinが出てきます)実装は下記。いうアノテーションをつけると、SpringがそのクラスをgRPCのServiceとして認識し、起動してくれます。これがあることでgRPCの導入がすごく簡単になっています。定義されているため、こちらを継承します。型のインスタンスに設定し、返却しているだけの処理になります。自動生成されるmessageのクラスの構造上、Builderパターンで生成する必要があります。いうクラスを使ってレスポンスを返しているのも通常のREST通信とは違うところです。gRPCはHTTP/2を標準で使用しているため、ストリーミングRPCという双方向通信が可能で、その関係でこの作りになっているのですが・・・こちらに関してはまた別の記事で書きます。通信の完了を通知するためのObserverと思ってください。実行しないと終了が検知されず、レスポンスは返却されません。作成したServiceを起動します。タスクを実行してください。bootRun下記のように、GreeteServiceを登録し、6565ポート(gRPCのデフォルト)でgRPCサーバーが立ち上がったメッセージが表示されれば成功です。実行して動作確認します。gRPCはRESTのようにcurlコマンドやPostmanで実行することはできないため、一手間必要です。いうツールを使います。grpccのインストールgrpccはgRPCを実行するためのクライアントツールです。github.comREADMEにも載っていますが、npmで簡単にインストールできます。grpccsayHelloの実行そしてプロジェクトのルートディレクトリで、下記のコマンドを実行します。オプションを付けて実行すると対話モードになります。リクエストパラメータをJSON形式で記載しEnter。grpccで用意されている、レスポンスを表示するためのコールバックです。takehata"}レスポンスが表示されます。BootでのgRPC起動は完了です。今回はここまで今回は触りで、一旦起動するところまでをやってみました。gRPCの機能とか設定の仕方とかまだまだ色々あるので、これから何回かに分けて書いていければなと思っています。はてなブログProプログラマとしての生き方とか、働き方とか、技術のことを雑多に書いていきます。CODE-セブンスコード-」のバックエンド技術DockerでMySQLを起動した時はバージョン差異に注意ブログの技術記事で書く内容をパターン分けしてみた2019年を雑に振り返る月別アーカイブはてなブログをはじめよう!take7010さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。