gRPC简介

gRPC简介

gRPC 和 protocol buffers 简介。

本页向您介绍 gRPC 和 protocol buffers。gRPC 可以将 protocol buffers 用作其接口定义语言 (IDL) 和底层消息交换格式。如果您是 gRPC 和或 protocol buffers 的新手,请阅读本文!如果您只是想深入了解 gRPC 的运行情况,请选择一种语言并尝试其快速启动。

概述

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

Concept Diagram

gRPC 客户端和服务器可以在各种环境中运行和相互通信-从谷歌内部的服务器到您自己的桌面-并且可以用 gRPC 支持的任何语言编写。因此,例如,您可以轻松地使用 Java 创建 gRPC 服务器,使用 Go、Python 或 Ruby 创建客户端。此外,最新的谷歌 API 将具有 gRPC 版本的界面,让您可以轻松地将谷歌功能构建到应用程序中。

使用 Protocol Buffers

默认情况下,gRPC 使用 Protocol Buffers,这是 Google 用于序列化结构化数据的成熟开源机制(尽管它可以与 JSON 等其他数据格式一起使用)。下面是它如何工作的快速介绍。如果您已经熟悉 protocol buffers,请跳到下一节。
使用 protocol buffers 时的第一步是定义要在 proto 文件中序列化的数据的结构:这是一个扩展名为 .proto 的普通文本文件。Protocol buffer 数据被构造为 messages,其中每个 message 是一个小的信息逻辑记录,包含一系列名值对,称为字段。下面是一个简单的例子:

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

然后,一旦指定了数据结构,就可以使用 protocol buffer 编译器从 protoc 定义生成首选语言的数据访问类。这些为每个字段提供了简单的访问器,如 name()set_name(),以及将 serialize/parse 整个结构 to/from 原始字节的方法。因此,例如,如果您选择的语言是 C++,那么在上面的示例中运行编译器将生成一个名为Person 的类。然后,您可以在应用程序中使用此类来填充、序列化和检索 Person protocol buffer messages。
在普通的 proto 文件中定义 gRPC 服务,将 RPC 方法参数和返回类型指定为 protocol buffer messages:

// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

gRPC 使用 protoc 和一个特殊的 gRPC 插件从 proto 文件生成代码:生成的 gRPC 客户端和服务器代码,以及用于填充、序列化和检索消息类型的常规 protocol buffer 代码。您将在下面看到一个示例。
要了解更多关于 protocol buffers 的信息,包括如何使用所选语言的 gRPC 插件安装 protoc,请参阅protocol buffers 文档

Protocol buffer 版本

虽然 protocol buffers 已经向开源用户开放了一段时间,但本网站的大多数示例使用 protocol buffers version 3 (proto3),该版本的语法稍微简化,一些有用的新功能,并支持更多语言。Proto3 目前有 Java、C++、Dart、Python、Objective-C、C#、lite runtime(Android Java)、Ruby 和 protocol buffers GitHub repo 中的JavaScript,以及 golang/protobuf 官方包 中的 Go 语言生成器,还有更多语言正在开发中。您可以在 proto3 语言指南 和每种语言的 参考文档 中找到更多信息。参考文档还包括 .proto 文件格式的 正式规范
一般来说,虽然您可以使用 proto2(当前默认的协议缓冲区版本),但我们建议您将 proto3 与 gRPC 一起使用,因为它允许您使用 gRPC 支持的所有语言,同时避免了 proto2 客户端与 proto3 服务器通信的兼容性问题,反之亦然。