Node.jsではじめるgRPC [@grpc/proto-loader]

2019年7月5日

gRPCのサーバー及びクライアントを、Node.jsで実装してみます。

 

 

gRPCとは?


 

gRPCとは、Googleが開発したRPC(remote procedure call:遠隔手続き呼び出し)のフレームワークです。RPC技術によって、別のホストのプログラムによるメソッドを呼び出すなどの処理を行うことができます。

 

gRPCは、HTTP/2によって通信が行われます。またデータをシリアライズ(シリアル化)するフォーマットとして、デフォルトでProtocol Buffers (通称:Protobuf)が利用されます。つまりこのProtocol Buffers によって言語の形式に依存せずにエンコードされたデータを HTTP/2 上で通信します。その際に利用するのが.protoファイルです。

 

本記事では、クライアントからサーバーにおいて、1度のリクエストに対して1度のレスポンスを返す Simple RPC を説明します。他にもストリーミングと呼ばれる Server-side streaming RPC や Client-side streaming RPC などの方式があります。

 

 

 

プロジェクトの作成


 

適当な名前のプロジェクトを作成します。

 

npmによって初期化を行い、必要なモジュールを追加します。

grpcはNode.jsのgRPC、@grpc/proto-loaderは .protoファイルを取り込むためのモジュールです。

 

dependencies項目は下記のようになりました。

 

 

.protoファイル


 

まず.protoファイルを作成します。名前はhello.protoにしました。この.protoファイルには、サーバー及びクライアントに共通な機能としてのインターフェース定義言語(IDL)を記述していきます。

 

.protoファイルには大まかに、インターフェイスとMessage(リクエストとレスポンスのメッセージ) を記述していきます。

 

hello.proto

1行目

Protocol Buffers のバージョンを指定しています。

 

2行目

.protoファイルを区別するためのパッケージ名です。

 

4〜6行目

serviceを定義し、インターフェイスとしてのメソッドを記述していきます。メソッドの引数にリクエスト、戻り値としてレスポンスを設定します。それぞれのリクエスト及びレスポンスは、message型オブジェクトとして記述しておく必要があります(8行目〜、13行目〜)。本記事ではSimple RPCの説明のみですが、例えばServer-side streaming RPCの場合は、下記のようにstreamを付与する必要があります。

 

参照ページ

gRPC Basics – Node.js  Defining the service

 

8〜11行目

messageとしてHelloRequestを定義しています。また= 1 や = 2 の様に、そのmessage型オブジェクトの中で一意の数値となるようタグを付与していく必要があります。またint32などのデータ型の種類は、下記参照ページをご覧下さい。

 

参照ページ

Scalar Value Types

 

 

サーバー


 

次にサーバー側の server.js を作成します。

 

server.js

5〜14行目

loadSync()で.protoファイルを読み込んでいます。Node.jsの場合は.protoファイルはコンパイルせずにそのまま読み込みます。keepCaseなどのオプションは下記参照ページをご覧下さい。

 

参照ページ

gRPC Protobuf Loader

 

起動します。

 

※もし@grpc/proto-loaderモジュールを利用しない古いバージョンによる記述だと、起動した場合下記のような注意が表示されます。

 

 

 

クライアント


 

最後に、上記で立ち上げたサーバーに対するクライアント側の client.js を作成します。

 

client.js

 

起動します。

 

 

 

参照ページ


 

gRPC

 

Protocol Buffers

 

gRPC Protobuf Loader

 

 

 

LINEで送る
Pocket

Copyright © 2019 思考の葉 All Rights Reserved.  プライバシーポリシー