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

用法概览

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

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

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

传输

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

选择传输方式(高级)

  • OkHttp
    OkHttp 是专为在移动设备上使用而设计的轻量级网络堆栈。它是 gRPC 在 Android 环境中运行的默认传输方式。要将 OkHttp 用作您的应用的 gRPC 传输,请使用AndroidChannelBuilder构建通道,它封装OkHttpChannelBuilder并注册网络监视器以快速响应 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。