gRPC 简介

174 阅读4分钟

这篇文章将向你介绍 gRPC 和 protocol buffers。gRPC 可以使用 protocol buffers 作为其接口定义语言(IDL)和底层消息交换格式。如果你是 gRPC 和 protocol buffers 新手,这篇文章适合你。

概述

在 gRPC 中,客户端应用程序可以直接调用另一台计算机上的服务器应用程序上的方法,就像它是一个本地对象一样,使你更容易创建分布式应用程序和服务。 就像许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以使用其参数和返回类型远程调用的方法。

在服务器端,服务端实现此接口并运行 gRPC 服务器来处理客户端的调用。 在客户端,客户端有一个存根,该存根提供与服务端相同的方法。

image.png

gRPC 客户端和服务端可以在各种环境中运行并相互通信,比如从 Google 内部的服务器到你自己的桌面环境,并且可以使用任何 gRPC 支持的语言编写。 因此,例如,你可以轻松地用 Java 创建一个 gRPC 服务器,并使用 Go、Python 或 Ruby 作为客户端调用。 此外,最新的 Google APIs 将有 gRPC 版本的接口,使你可以轻松地将 Google 功能构建到你的应用程序中。

使用 Protocol Buffers

默认情况下,gRPC 使用 Protocol Buffers 来序列化结构化数据(尽管它可以与 JSON 等其它数据格式一起使用)。下面是关于它工作原理的快速介绍,如果你已经熟悉了 Protocol Buffers ,请跳过这一节。

使用 Protocol Buffers 的第一步是要在 proto 文件中定义序列化的数据的结构:这是一个普通的文本文件,扩展名为 .proto

Protocol Buffers 数据被构造为消息(message),其中每个消息都是包含一系列称为为键值对的逻辑记录。 下面是一个简单的例子:

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

然后,一旦指定了数据结构,就可以使用 protocol buffer 编译器 protoc 使用 proto 中定义的首选语言生成数据访问类。

这些类为每个字段提供简单的访问器,如 name() 和 set_name(),以及将整个结构序列化/解析为原始字节的方法。

因此,例如,如果你选择的语言是 C++,在上面的例子中运行编译器将生成一个叫做 Person 的类。然后你可以在你的应用程序中使用这个类来填充、序列化和检索 Person protocol buffer 消息。

你在普通的 proto 文件中定义 gRPC 服务,并使用 RPC 方法参数和指定的返回类型作为 protocol buffer 消息:

// 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 代码。后面将会以 Go 语言做一个示例。

要了解 protocol buffers 更多的信息,包括如何以你选择的语言安装 protoc gRPC插件,请参阅:protocol buffers documentation

Protocol Buffer 版本

protocol buffers 这个网站已经面向所有人开放很长一段时间了,这个站点的大多数例子都使用 protocol buffer v3版本(proto3),它具有稍微简化的语法,一些有用的新功能,并支持更多的语言。Proto3 目前在 Java、C++、Dart、Python、Objective-C、C#、lite-runtime(Android Java)、Ruby 和 JavaScript 中可用。protocol buffers GitHub repo,以及来自 ‎golang/protobuf 官方软件包‎,更多语言正在开发中,你可以在 proto3 language guidereference documentation 中找到更多关于语言的信息,reference documentation 还包括对 .proto 文件格式的正式介绍。

通常,虽然你可以使用 proto2(当前 protocol buffer 使用的默认版本),但建议你将 proto3 与 gRPC 一起使用,因为它允许你使用所有 gRPC 支持的语言,并避免与 proto2 客户端与 proto3 服务器通信的兼容性问题,反之亦然。

希望这篇文章对你有帮助,我们下次再会。

Introduction to gRPC
grpc.io/docs/what-i…
Protocol Buffers
developers.google.com/protocol-bu…
proto3 language guide
developers.google.com/protocol-bu…
formal specification
developers.google.com/protocol-bu…