目录
我可以将 gRPC 与我最喜欢的数据格式(JSON、Protobuf、Thrift、XML)一起使用吗?
为什么 gRPC 比任何二进制 blob 都优于 HTTP/2?
gRPC 简介
gRPC 和协议缓冲区简介。
本页介绍 gRPC 和协议缓冲区。gRPC 可以使用 协议缓冲区作为其接口定义语言 (IDL) 和基础消息 交换格式。如果你不熟悉 gRPC 和/或协议缓冲区,请阅读此内容! 如果只想深入了解并首先查看 gRPC 的运行情况,请选择一种语言并尝试其快速入门。
概述
在 gRPC 中,客户端应用程序可以直接调用服务器应用程序上的方法 在不同的计算机上,就好像它是本地对象一样,使您可以更轻松地 创建分布式应用程序和服务。与许多 RPC 系统一样,gRPC 是 基于定义服务的思想,指定可以 使用其参数和返回类型远程调用。在服务器端, 服务器实现此接口并运行 gRPC 服务器来处理客户端调用。 在客户端,客户端有一个存根(在某些中称为客户端 语言),提供与服务器相同的方法。
gRPC 客户端和服务器可以在各种 环境 - 从 Google 内部的服务器到您自己的桌面 - 并且可以 以任何 gRPC 支持的语言编写。因此,例如,您可以轻松地 在 Java 中创建 gRPC 服务器,并使用 Go、Python 或 Ruby 中的客户端。另外 最新的 Google API 将具有其接口的 gRPC 版本,让您 轻松将 Google 功能构建到您的应用程序中。
使用协议缓冲区
默认情况下,gRPC 使用协议缓冲区,谷歌的 用于序列化结构化数据的成熟开源机制(尽管它 可以与其他数据格式(如 JSON)一起使用)。以下是如何快速介绍 它有效。如果您已经熟悉协议缓冲区,请随时跳过 继续下一节。
使用协议缓冲区的第一步是定义结构 对于要在原型文件中序列化的数据:这是普通文本 带有扩展名的文件。协议缓冲区数据结构化为消息,其中每条消息都是一个小的信息逻辑记录 包含一系列称为字段的名称-值对。这是一个简单的 例:.proto
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
然后,一旦指定了数据结构,就可以使用协议缓冲区 编译器以首选语言生成数据访问类 () 从您的原型定义。这些为每个字段提供了简单的访问器, 喜欢和,以及序列化/解析的方法 原始字节的整个结构。因此,例如,如果您选择 语言是C++,在上面的例子上运行编译器将生成一个 类称为 。然后,可以在应用程序中使用此类来 填充、序列化和检索协议缓冲区消息。protocname()set_name()PersonPerson
定义 gRPC 服务 在普通原型文件中,RPC 方法参数和返回类型指定为 协议缓冲区消息:
// 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 与特殊的 gRPC 插件一起使用 从您的原型文件生成代码:您得到 生成的 gRPC 客户端和服务器代码,以及常规协议缓冲区 用于填充、序列化和检索消息类型的代码。若要了解有关协议缓冲区的详细信息,包括如何使用 所选语言的 gRPC 插件,请参阅protocprotoc协议缓冲区文档.
协议缓冲区版本
而协议缓冲区已经可供开源用户使用一段时间, 本网站的大多数示例都使用协议缓冲区版本 3 (Proto3),它具有 稍微简化的语法,一些有用的新功能,并支持更多 语言。Proto3目前可用于Java,C++,Dart,Python, Objective-C,C#,一个精简运行时(Android Java),Ruby和JavaScript来自协议缓冲区 GitHub 存储库,以及来自戈朗/普罗托布夫官方套餐,还有更多语言正在开发中。您可以 在原型3语言指南和参考 文档适用于每种语言。参考文档还 包括一个正式规范作为文件格式。.proto
通常,虽然您可以使用 proto2(当前默认协议缓冲区 版本),我们建议您将 proto3 与 gRPC 一起使用,因为它允许您使用 全系列的 gRPC 支持的语言,以及避免兼容性 Proto2 客户端与 Proto3 服务器通信的问题,反之亦然。
概述
服务定义
与许多 RPC 系统一样,gRPC 基于定义服务的思想, 指定可以使用其参数远程调用的方法,以及 返回类型。默认情况下,gRPC 使用协议 缓冲区作为接口 定义语言 (IDL),用于描述服务接口和 有效负载消息的结构。在以下情况下,可以使用其他替代方案 期望。
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string greeting = 1;
}
message HelloResponse {
string reply = 1;
}
gRPC 允许您定义四种服务方法:
- 一元 RPC,其中客户端向服务器发送单个请求并获得 单响应返回,就像正常的函数调用一样。
rpc SayHello(HelloRequest) returns (HelloResponse);
- 服务器流式处理 RPC,其中客户端向服务器发送请求并获取 用于读回消息序列的流。客户端从 返回流,直到没有更多消息。gRPC 保证消息 在单个 RPC 调用中排序。
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
- 客户端流式处理 RPC,其中客户端写入一系列消息并发送 它们到服务器,再次使用提供的流。一旦客户有 写完消息,它等待服务器读取它们并返回 它的回应。同样,gRPC 保证单个 RPC 中的消息排序 叫。
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
- 双向流式处理 RPC,其中双方发送一系列消息 使用读写流。这两个流独立运行,因此客户端 服务器可以按照他们喜欢的任何顺序读取和写入:例如, 服务器可以等待接收所有客户端消息,然后再写入其 响应,或者它可以交替阅读消息然后编写消息,或者 读取和写入的其他一些组合。每个消息的顺序 流被保留。
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
您将在下面的 RPC 生命周期部分中了解有关不同类型的 RPC 的更多信息。
使用接口
从文件中的服务定义开始,gRPC 提供协议 生成客户端和服务器端代码的缓冲区编译器插件。gRPC 用户 通常在客户端调