gRPC は、最新のオープンソースで高性能な RPC フレームワークであり、さまざまな環境で動作します。負荷分散、トレース、ヘルスチェック、認証のプラグ可能なサポートにより、データセンター内やセンター間で効率的にサービスを接続できます。分散コンピューティングのラストマイルで適用して、デバイス、モバイルアプリ、ブラウザをバックエンドサービスに接続することもできます。ドキュメントは gRPC の公式ウェブサイトにあります。また、オープンソース コミュニティからサポートを受けられます。このガイドでは、gRPC を使用して Android アプリを作成するソリューションを紹介します。
grpc.io は gRPC プロジェクトの公式ウェブサイトです。gRPC の仕組みの詳細については、What is gRPC? と gRPC Concepts をご覧ください。Android アプリで gRPC を使用する方法については、gRPC Android Java Quickstart の 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 向けに最適化された codegen プラグイン(Protobuf Java Lite)によるシリアル化 / シリアル化解除メソッドとして、プロトコル バッファ(Protobuf)使用します。テキストベースの形式(JSON など)と比較して、Protobuf はマーシャリング速度とコードサイズの点で効率的なデータ交換が可能であり、モバイル環境での使用に適しています。また、Protobuf のメッセージ / サービス定義構文は簡潔なため、アプリのデータモデルとアプリケーション プロトコルを大幅に簡単に定義できます。
使い方の概要
gRPC Basics - Android Java チュートリアルに従って Android アプリで gRPC を使用するには、次の 4 つのステップがあります。
- プロトコル バッファを使用して RPC サービスを定義し、gRPC クライアント インターフェースを生成します。
- クライアントとサーバーの間の RPC 呼び出しの媒体として機能するチャネルを構築します。
- クライアント側から RPC 呼び出しを開始するためのエントリ ポイントとして、クライアント スタブを作成します。
- ローカルの手続き呼び出しを実施する場合と同様に、リモート サーバーに対して RPC 呼び出しを行います。
デモ用に、この例ではバイトがプレーン テキストで送信されます。ただし、本番環境では常にアプリでネットワーク データを暗号化する必要があります。gRPC は、SSL/TLS 暗号化のサポートと、認証用に OAuth トークンの交換(Google サービスとの OAuth2)を提供します。詳細については、TLS on Android と Using OAuth2 をご覧ください。
トランスポート
gRPC には、Android クライアント用のトランスポート実装として、OkHttp と Cronet という 2 つの選択肢があります。
トランスポートを選択する(高度)
- OkHttp
- OkHttp は、モバイルで使用するために設計された軽量なネットワーク スタックです。Android 環境で実行するための、gRPC のデフォルトのトランスポートです。OkHttp をアプリの gRPC トランスポートとして使用するには、
AndroidChannelBuilder
を使用してチャネルを作成します。これにより、OkHttpChannelBuilder
をラップし、Android OS でネットワーク モニターを登録してネットワークの変更にすばやく対応します。使用例は、gRPC-Java AndroidChannelBuilder にあります。
- Cronet(試験運用版)
- Cronet は、モバイル用のライブラリとしてパッケージ化された Chromium のネットワーク スタックです。最先端の QUIC プロトコルによる堅牢なネットワーク サポートを提供します。これは信頼性の低いネットワーク環境で特に効果的です。Cronet の詳細については、Cronet を使用してネットワーク操作を実行するをご覧ください。アプリの gRPC トランスポートとして Cronet を使用するには、
CronetChannelBuilder
を使用してチャネルを作成します。使用例については、gRPC-Java Cronet Transport をご覧ください。
一般に、より強力なネットワーク スタックを提供するため、最近の SDK バージョンを対象とするアプリでは Cronet を使用することをおすすめします。Cronet を使用することの欠点は、APK のサイズが増えることです。バイナリの Cronet 依存関係を追加すると、アプリのサイズが 1 MB 以上増えます(OkHttp の場合は 100 KB です)。GMSCore v.10 以降では、Cronet の最新版を Google Play 開発者サービスから読み込めます。APK のサイズはもう問題ではないかもしれませんが、最新の GMSCore がインストールされていないデバイスでも OkHttp を使用することをおすすめします。