什么是 gRPC

🌙
手机阅读
本文目录结构

简介

本文档向您介绍gRPC和协议缓冲区。

gRPC可以将协议缓冲区用作其接口定义语言(IDL)和其基础消息交换格式。

如果您不熟悉gRPC和/或协议缓冲区,请阅读本章!

总览

在gRPC中,客户端应用程序可以直接在其他计算机上的服务器应用程序上调用方法,就好像它是本地对象一样,这使您更轻松地创建分布式应用程序和服务。

与许多RPC系统一样,gRPC围绕定义服​​务的思想,指定可通过其参数和返回类型远程调用的方法。

在服务器端,服务器实现此接口并运行gRPC服务器以处理客户端调用。在客户端,客户端具有一个存根(在某些语言中仅称为客户端),提供与服务器相同的方法。

https://a.axihe.com/edu/gprc/landing-2.svg

从Google内部的服务器到您自己的台式机,gRPC客户端和服务器可以在各种环境中运行并相互通信,并且可以使用gRPC支持的任何语言编写。

因此,例如,您可以使用Go,Python或Ruby的客户端轻松地用Java创建gRPC服务器。

此外,最新的Google API的接口将具有gRPC版本,可让您轻松地在应用程序中内置Google功能。

使用协议缓冲区

默认情况下,gRPC使用 协议缓冲区,这是Google成熟的开源机制,用于序列化结构化数据(尽管它可以与其他数据格式(例如JSON)一起使用)。这里是它的工作原理的快速介绍。如果您已经熟悉协议缓冲区,请随时跳到下一部分。

使用协议缓冲区的第一步是为要在原始文件中序列化的数据定义结构:这是带有.proto扩展名的普通文本文件。协议缓冲区数据被构造为 消息,其中每个消息都是信息的小逻辑记录,其中包含一系列称为字段的名称/值对。这是一个简单的例子:

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

然后,一旦您指定了数据结构,就可以使用协议缓冲区编译器protoc从原型定义中以首选语言生成数据访问类。这些为每个字段(如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还protoc与特殊的gRPC插件一起使用,可从您的原始文件生成代码。

但是,使用gRPC插件,您可以获得生成的gRPC客户端和服务器代码,以及用于填充,序列化和检索消息类型的常规协议缓冲区代码。我们将在下面更详细地查看此示例。

您可以在Protocol Buffers文档中找到有关协议缓冲区的更多信息,并protoc在所选语言的快速入门中找到如何获取和安装gRPC插件。

协议缓冲区版本

虽然协议缓冲区已经为开放源用户提供了一段时间,但我们的示例使用了一种称为proto3的新型协议缓冲区,它具有稍微简化的语法,一些有用的新功能并支持更多语言。

当前可从协议缓冲区GitHub repo中以Java,C ++,Python,Objective-C,C#,精简版运行时(Android Java),Ruby和JavaScript 以及golang / protobuf GitHub中的Go语言生成器使用repo,正在开发更多语言。

您可以在proto3语言指南和 每种语言的 参考文档中找到更多信息。参考文档还包括 正式的规范 为.proto 文件格式。

通常,虽然您可以使用proto2(当前的默认协议缓冲区版本),但我们建议您将proto3与gRPC一起使用,因为它可以使用所有gRPC支持的语言,并且可以避免与proto2客户端通信时出现的兼容性问题。 proto3服务器,反之亦然。

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了