気になっていたgRPCをせっかくの機会なので試してみました。基本はgRPCの公式のサンプルとほぼ変わっていませんが、サーバー側とAndroid/iOSを連携するために必要なものをまとめてみました。frameworkGoogleが作ったRPCフレームワークです。Buffersを使ってます。Buffersのインターフェース定義からgRPCのコード生成できるようになっています。Buffersの.protoファイルからコードを生成するためのビルドツールをインストールします。Macを使っているので、今回はHomebrewを使ってインストールします。Buffersのインターフェースの定義ファイルになります。インタフェース定義言語(IDL)を使って記述していきます。これを元にソースコードを生成します。サーバーとクライアントの両方で同じファイルを使用するのでjavaやobjcの設定もあります。Buffersのドキュメントを見てください。メッセージとしてHelloRequestとHelloReplyを定義して、GreeterというサービスでRPCのSayHelloメソッドを定義している感じです。helloworld.protoで保存します。今回はRubyでやります。initGemfileを次のようにします。vendor/bundleprotoファイルからソースコード生成protocというコマンドを使ってソースコードを生成します。libディレクトリに出力するので事前にディレクトリを作成しています。helloworld.protoは一つ上の階層のprotosディレクトリに配置しています。パスは適宜変更指定ください。../protos/helloworld.protoこれを実行するとソースコードが2つ生成されていると思います。lib/helloworld_pb.rblib/helloworld_services_pb.rbサーバー側コードかなり分かってないこと多いですが、先程のprotoファイルから生成されたコードを使ってRPCサーバーを起動しています。この例ではもらったリクエストパラメータにHelloという文字列をつけて返却しています。server.rbこれでサーバー起動します。Androidクライアント適当にプロジェクトを作ります。bufferのプラグインを追加します。}}app直下のbuild.gradleにgRPC関連の設定と、protoからコードを生成するための設定を追記します。}}protoファイルapp/src/mainにprotoディレクトリを作ってそこに、先程作成したhelloworld.protoを配置します。確認した感じですと、protoっていうディレクトリ名が重要でこれを間違えているとうまくビルドできませんでした。ビルドビルドをすると、app/build/generated/source/proto内にソースコードが生成されていると思います。ソースコードサーバーとの通信するには、protoファイルから生成されたものを使用して通信します。newBlockingStubでstubを作ると、処理をブロックして通信が終わるのを待ちます。reply.getMessage();非同期でやる場合は次のようにnewStubでstubを作って、メソッドを呼び出すときにObserverを渡してあげる感じになります。}});iOSこちらも適当にプロジェクトを作ります。今回はSwiftでやっています。CocoaPodsCocoaPodsを使いますが、結構特殊な感じになってます。podspecを作ります。通常はライブラリ作るときに使うんですけど、protoファイルから生成したコードをライブラリとして設定するためのものになります。authorsやディレクトリ等の設定は環境に合わせてください。authorsとかはとりあえずサンプルの設定のままやってます。s.prepare_commandのとこでprotoファイルからソースコードを生成しています。HelloWorld.podspecとして保存します。}endPodfileは以下のように自分のディレクトリをライブラリとして読み込むように設定します。'.'endここまで出来たらインストールします。installソースコードgRPCのコードはObjective-Cになっていますので、Bridging-Headerに使用するものをimportします。<HelloWorld/Helloworld.pbrpc.h>Swift側のコードimportします。HelloWorld最後に通信する処理を記述します。}})まとめ少し触ってみた感じ使いこなせるとだいぶ強力だなと思いました。型もあって、メソッド呼び出しと変わらないので、JSONより断然扱いやすかったです。protoファイルによってインターフェースもしっかり定義されるので、それ自体が仕様になるのも良かったです。敷居は高い感じですが、導入事例も国内外で結構あるようなので今後選択肢に入ってくるのではないでしょうか。