简介

gRPC 和协议缓冲区简介

本页面将向您介绍 gRPC 和协议缓冲区。gRPC 可以将协议缓冲区作为其接口定义语言(IDL)和底层消息交换格式。如果您是 gRPC 或协议缓冲区的新手,请阅读此内容!如果您只想先了解 gRPC 的实际应用,请选择一种语言并尝试其快速入门。

概述

在 gRPC 中,客户端应用程序可以像调用本地对象一样直接调用远程服务器应用程序的方法,这使得您可以更轻松地创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 基于定义服务的概念,指定可以远程调用的方法及其参数和返回类型。在服务器端,服务器实现该接口并运行 gRPC 服务器来处理客户端的调用。在客户端,客户端具有一个存根(在某些语言中简称为 客户端),提供与服务器相同的方法。

image 2024 12 23 12 52 30 394

gRPC 客户端和服务器可以在各种环境中运行并进行通信——从 Google 内部的服务器到您的桌面——并且可以用任何 gRPC 支持的语言编写。例如,您可以轻松地在 Java 中创建 gRPC 服务器,在 Go、Python 或 Ruby 中创建客户端。此外,最新的 Google API 将提供其接口的 gRPC 版本,允许您轻松地将 Google 功能集成到您的应用程序中。

使用协议缓冲区

默认情况下,gRPC 使用 协议缓冲区(Protocol Buffers),这是 Google 用于序列化结构化数据的成熟开源机制(尽管它也可以与其他数据格式如 JSON 一起使用)。下面是一个快速介绍它是如何工作的。如果您已经熟悉协议缓冲区,可以跳过此部分。

使用协议缓冲区的第一步是定义要序列化的数据结构,在 proto 文件中完成:这是一个普通的文本文件,扩展名为 .proto。协议缓冲区数据以消息(message)形式结构化,每个消息都是包含一系列名称-值对(字段)的逻辑记录。下面是一个简单的例子:

message Person {
  string name = 1;
  int32 id = 2;
  bool has_ponycopter = 3;
}

然后,一旦定义了数据结构,您可以使用协议缓冲区编译器 protoc 从您的 proto 定义中生成数据访问类,适用于您选择的语言。这些类提供了每个字段的简单访问器,如 name()set_name(),以及将整个结构序列化/解析为原始字节的方法。例如,如果您选择的语言是 C++,运行编译器后会生成一个名为 Person 的类。然后,您可以在应用程序中使用该类来填充、序列化和检索 Person 协议缓冲区消息。

您可以在普通的 proto 文件中定义 gRPC 服务,其中 RPC 方法的参数和返回类型指定为协议缓冲区消息:

// Greeter 服务定义
service Greeter {
  // 发送问候
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// 请求消息,包含用户的名字
message HelloRequest {
  string name = 1;
}

// 响应消息,包含问候内容
message HelloReply {
  string message = 1;
}

gRPC 使用 protoc 配合一个特殊的 gRPC 插件来从您的 proto 文件生成代码:您将获得生成的 gRPC 客户端和服务器代码,以及用于填充、序列化和检索您的消息类型的常规协议缓冲区代码。要了解更多关于协议缓冲区的内容,包括如何在您选择的语言中安装 protocgRPC 插件,请参阅 协议缓冲区文档

协议缓冲区版本

尽管 协议缓冲区 已对开源用户开放了一段时间,但本网站中的大多数示例使用协议缓冲区版本 3(proto3),它具有简化的语法、新增的有用功能,并支持更多语言。Proto3 目前支持 JavaC++DartPythonObjective-CC#轻量级运行时(Android Java)RubyJavaScript 等语言,https://github.com/google/protobuf/releases[协议缓冲区 GitHub 仓库中] 还提供 Go 语言生成器,更多语言正在开发中。您可以通过 proto3 语言指南 和每种语言的 参考文档 了解更多信息。参考文档还包括 .proto 文件格式的正式规范。

一般来说,尽管您可以使用 proto2(当前默认的协议缓冲区版本),但我们建议您在使用 gRPC 时选择 proto3,因为它允许您使用所有 gRPC 支持的语言,并避免了 proto2 客户端与 proto3 服务器之间的兼容性问题,反之亦然。