开发学院

您的位置:首页>教程>正文

教程正文

gRPC 概况

gRPC 概况

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

landing-2.jpg

  gRPC客户端和服务器可以在各种环境中运行和相互交换数据,从谷歌内部的服务器到你自己的桌面电脑,并且可以用gRPC支持的任何语言编写。例如,您可以用Java创建一个gRPC服务器,客户端使用Go、Python或Ruby开发。此外,最新的Google APIs将有gRPC版本的接口,让你可以轻松地将功能集成到你的应用程序中。

跟Protocol Buffers集成

  默认情况下,gRPC使用Protocol buffer,这是Google用于序列化结构化数据的成熟开源机制(尽管它可以与JSON等其他数据格式一起使用)。下面是它的简单介绍。如果您已经熟悉Protocol buffer,请跳到下一节。

  使用协议缓冲区时的第一步是定义要在原型文件中序列化的数据的结构:这是一个.proto后缀的文件。协议缓冲区数据被结构化为消息,其中每个消息都是包含一系列名值对(称为字段)的信息的小逻辑记录。这里有一个简单的例子:

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

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

  正如您将在我们的示例中看到的,您可以在普通原型文件中定义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客户端和服务器代码,以及用于填充、序列化和检索消息类型的常规协议缓冲区代码。我们将在下面更详细地看这个例子。

  你可以在Protocol buffer文档中找到更多关于Protocol buffer的信息,并找到用你选择的语言的快速入门和安装gRPC插件的协议。

Protocol buffer版本

  虽然开放源码用户可以使用Protocol buffer已经有一段时间了,但是我们的例子使用了新版本的Protocol buffer,叫做proto3,它具有稍微简化的语法,一些有用的新特性,并且支持更多的语言。这目前在Java、C++、Python、Objective-C、C#、Android Java 、Ruby和JavaScript,以及golang,未来会支持更多语言。您可以在proto3语言指南和不同编程语言的参考文档中获取更多信息。

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