Google 致力于为黑人社区推动种族平等。查看具体举措

使用 gRPC 构建客户端-服务器应用

gRPC 是一种可在任何环境中运行的现代开源高性能 RPC 框架。借助可插拔支持,它可以在数据中心内和跨数据中心高效地连接服务,以实现负载平衡、跟踪、运行状况检查和身份验证。它也适用于在分布式计算的最后环节将设备、移动应用和浏览器连接到后端服务。您可以在 gRPC 的官方网站上找到相关文档,并获取开源社区的支持。本指南将向您介绍使用 gRPC 构建 Android 应用的解决方案。

grpc.io 是 gRPC 项目的官方网站。要详细了解 gRPC 的工作原理,请参阅什么是 gRPC?gRPC 概念。要了解如何在 Android 应用中使用 gRPC,请参阅 gRPC Android Java 快速入门中的 Hello World 示例。您还可以在 GitHub 上找到其他几个 gRCP Android 示例。

功能

过程调用简化操作
由于它是 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 精简版)将协议缓冲区 (Protobuf) 用作其序列化/反序列化方法。与基于文本的格式(例如 JSON)相比,Protobuf 在编组速度和代码大小方面提供了更高效的数据交换,因此更适合在移动环境中使用。此外,Protobuf 简明的消息/服务定义语法有助于您更轻松地为应用定义数据模型和应用协议。

用法概览

根据 gRPC 基础知识 - Android Java 教程,为 Android 应用使用 gRPC 涉及四个步骤:

  • 使用协议缓冲区定义 RPC 服务并生成 gRPC 客户端接口。
  • 构建一个渠道,作为在客户端和服务器之间进行 RPC 调用的媒介。
  • 创建客户端存根作为从客户端发起 RPC 调用的入口点。
  • 像执行本地过程调用一样,对远程服务器进行 RPC 调用。

为了便于演示,在提供的示例中,字节以纯文本形式传输。不过,您的应用应始终对生产环境中的网络数据进行加密。gRPC 提供 SSL/TLS 加密支持以及用于身份验证的 OAuth 令牌交换(Google 服务为 OAuth2)。如需了解详情,请参阅 Android 上的 TLS使用 OAuth2

传输

gRPC 为 Android 客户端提供两种传输实现方式:OkHttp 和 Cronet。

选择传输方式(高级)

  • OkHttp
    OkHttp 是专为在移动设备上使用而设计的轻量级网络堆栈。它是 gRPC 在 Android 环境中运行的默认传输方式。要将 OkHttp 用作应用的 gRPC 传输方式,请使用 OkHttpChannelBuilder 构建频道,该构建器会封装 AndroidChannelBuilder,并将网络监视器注册到 Android 操作系统以快速响应网络更改。示例用法可以在 gRPC-Java AndroidChannelBuilder 中找到。
  • Cronet(实验性)
    Cronet 是 Chromium 的网络堆栈,打包为面向移动设备的库。它借助先进的 QUIC 协议提供强大的网络支持,这在不可靠的网络环境中尤其有效。要详细了解 Cronet,请参阅使用 Cronet 执行网络操作。要使用 Cronet 作为应用的 gRPC 传输方式,请使用 CronetChannelBuilder 构造渠道。gRPC-Java Cronet 传输中提供了一个示例用法。

一般来说,我们建议定位到近期 SDK 版本的应用使用 Cronet,因为它提供了更强大的网络堆栈。使用 Cronet 的缺点是会增加 APK 的大小,因为添加二进制 Cronet 依赖项会使应用大小增加 1MB 以上,而 OkHttp 约为 100KB。从 GMSCore v.10 开始,可以从 Google Play 服务加载 Cronet 的最新副本。APK 大小可能不再是一个问题,尽管安装了最新 GMSCore 的设备可能仍然偏向于使用 OkHttp。