gRPC を使用してクライアント サーバー アプリを作成する

gRPC は、あらゆる環境で実行できる最新のオープンソースの高性能 RPC フレームワークです。ロード バランシング、トレース、ヘルスチェック、認証のプラグイン対応サポートにより、データセンター内やデータセンター間でサービスを効率的に接続できます。また、デバイス、モバイルアプリ、ブラウザをバックエンド サービスに接続する分散型コンピューティングのラスト ワンマイルにも適用できます。gRPC の公式ウェブサイトでドキュメントを参照したり、オープンソース コミュニティからサポートを受けたりできます。このガイドでは、gRPC を使用して Android アプリを作成するためのソリューションについて説明します。

grpc.io は gRPC プロジェクトの公式ウェブサイトです。gRPC の仕組みの詳細については、gRPC とはをご覧ください。gRPC のコンセプトをご覧ください。Android アプリで gRPC を使用する方法については、gRPC Android Java クイックスタートの Hello World の例をご覧ください。GitHub にも、Android で gRPC を使用する例が他にいくつかあります。

機能

手続き呼び出しでシンプルにする
RPC であるため、プログラミング モデルはプロシージャ コールになります。このテクノロジーのネットワーク部分はアプリケーション コードから切り離されているため、通常のプロセス内関数呼び出しのように見えます。クライアントとサーバーのやり取りは、HTTP リソース メソッド(GET、PUT、POST、DELETE など)のセマンティクスによる制約を受けません。REST API と比較すると、HTTP プロトコル メタデータを処理することなく、より自然に実装できます。
HTTP/2 による効率的なネットワーク伝送
モバイル デバイスからバックエンド サーバーにデータを送信すると、リソースの消費が非常に多くなる可能性があります。標準の HTTP/1.1 プロトコルを使用する場合、モバイル デバイスからクラウド サービスに頻繁に接続すると、バッテリーが消耗したり、レイテンシが増加したり、他のアプリの接続がブロックされたりすることがあります。デフォルトでは、gRPC は HTTP/2 上で動作し、双方向ストリーミング、フロー制御、ヘッダー圧縮、単一の TCP/IP 接続でリクエストを多重化する機能を導入します。その結果、gRPC によってリソース使用量が削減され、アプリとクラウドで実行されているサービス間のレスポンス時間が短縮され、ネットワーク使用量が削減され、モバイル デバイスで実行されているクライアントのバッテリー寿命が延びます。
組み込みのストリーミング データ交換サポート
gRPC は、HTTP/2 での全二重双方向ストリーミングのサポートを最初から考慮して設計されています。ストリーミングでは、大量の情報のアップロードやダウンロードが必要なオペレーションなど、リクエストとレスポンスのサイズを任意に指定できます。ストリーミングでは、クライアントとサーバーはメッセージの読み取りと書き込みを同時に行い、リソース ID をトラッキングすることなく相互にサブスクライブできます。これにより、アプリの実装の柔軟性が向上します。
プロトコル バッファによるシームレスな統合
gRPC は、Android 向けに最適化されたコード生成プラグイン(Protobuf Java Lite)によるシリアル化/シリアル化解除メソッドとしてプロトコル バッファ(Protobuf)を使用します。テキストベースの形式(JSON など)と比較して、Protobuf はマーシャリングの速度とコードサイズの点でより効率的にデータを交換できるため、モバイル環境で使用するのに適しています。また、Protobuf の簡潔なメッセージ/サービス定義構文により、アプリのデータモデルとアプリケーション プロトコルの定義がはるかに容易になります。

使い方の概要

gRPC の基本 - Android Java チュートリアルに沿って、Android アプリで gRPC を使用するには、次の 4 つのステップを行います。

  • プロトコル バッファを使用して RPC サービスを定義し、gRPC クライアント インターフェースを生成します。
  • クライアントとサーバー間の RPC 呼び出しのメディアとして機能するチャネルを構築します。
  • クライアント サイドから RPC 呼び出しを開始するためのエントリ ポイントとしてクライアント スタブを作成します。
  • ローカル プロシージャ コールを実行するときと同じように、リモート サーバーに対して RPC 呼び出しを行います。

わかりやすく説明するために、この例では、バイトを書式なしテキストで送信します。ただし、アプリは常に本番環境でネットワーク データを暗号化する必要があります。gRPC は、認証のための SSL/TLS 暗号化のサポートと OAuth トークンの交換(Google サービスと OAuth2)を提供します。詳しくは、Android での TLSOAuth2 の使用をご覧ください。

移動手段

gRPC には、Android クライアント用のトランスポート実装として OkHttp と Cronet の 2 つが用意されています。

トランスポートを選択する(高度)

  • OkHttp
    OkHttp は、モバイルで使用するために設計された軽量なネットワーク スタックです。これは、Android 環境で実行するための gRPC のデフォルト トランスポートです。OkHttp をアプリの gRPC トランスポートとして使用するには、AndroidChannelBuilder でチャネルを作成します。これは OkHttpChannelBuilder をラップし、ネットワーク モニターを Android OS に登録して、ネットワークの変更に迅速に対応します。使用例については、gRPC-Java AndroidChannelBuilder をご覧ください。
  • Cronet(試験運用版)
    Cronet は、モバイル用のライブラリとしてパッケージ化された Chromium のネットワーク スタックです。最先端の QUIC プロトコルによる堅牢なネットワーク サポートを提供し、信頼性の低いネットワーク環境で特に効果的です。Cronet の詳細については、Cronet を使用してネットワーク オペレーションを実行するをご覧ください。Cronet をアプリの gRPC トランスポートとして使用するには、CronetChannelBuilder を使用してチャネルを作成します。使用例については、gRPC-Java Cronet トランスポートをご覧ください。

一般に、最新の SDK バージョンをターゲットとするアプリでは、より強力なネットワーク スタックを提供する Cronet を使用することをおすすめします。Cronet を使用するデメリットは、APK のサイズが大きくなることです。バイナリの Cronet 依存関係を追加すると、アプリサイズが 1 MB を超え、OkHttp が最大 100 KB になります。GMSCore v.10 以降では、Cronet の最新コピーを Google Play 開発者サービスから読み込めます。APK サイズは問題ではなくなりましたが、最新の GMSCore がインストールされていないデバイスでは、引き続き OkHttp が使用されます。