gRPC 简介:为什么?是什么?如何?为什么要使用 gRPC?什么是 gRPC?它是如何工作的?gRPC 如何生成代码?

2025-06-07

gRPC 简介:为什么、是什么、如何?

为什么选择 gRPC?

什么是 gRPC?它是如何工作的?

gRPC 如何生成代码?

您好,欢迎来到 TECH SCHOOL。在本课程中,我们将学习gRPC以及如何将其与协议缓冲区结合使用,用 Go 和 Java 开发应用程序。

这是Youtube 上完整 gRPC 课程播放列表的链接
Github 存储库:pcbook-gopcbook-java
Gitlab 存储库:pcbook-gopcbook-java

为什么选择 gRPC?

让我们从一个简单的问题开始:gRPC 的动机是什么?或者说,gRPC 试图解决什么问题?

嗯,答案就是沟通。

应用程序使用不同的编程语言编写。
例如,后端可以用 Go 编写,而前端(例如,Android 应用用 Java 编写,iOS 应用用 Swift 编写)则用 Go 编写。
那么它们如何相互通信呢?

如今的趋势是使用微服务架构。因此,即使在后端,我们也可能有许多用不同语言(例如 Go、Python 或 Rust)编写的服务,具体取决于业务需求和技术限制。

服务之间的通信

因此,为了相互通信,它们必须就一组 API 契约达成一致。例如:通信通道、身份验证机制、有效负载格式、数据模型以及如何处理错误。

有很多事情需要考虑,这就是为什么构建 API 非常困难。

沟通应该高效

更重要的是,我们希望通信高效,也就是快速且轻量。众所周知,微服务之间交换的消息数量非常庞大。因此,通信速度越快越好。

此外,在某些环境中,例如移动应用程序,网络速度和带宽有限,因此拥有一个轻量级的通信协议来与服务器交互非常重要。

最后但同样重要的一点是,我们希望通信简单易行。假设我们正在构建一个包含数百甚至数千个微服务的系统。我们肯定不想花费大量时间编写代码,只是为了让它们相互通信,对吧?

我们希望有这样一种框架,让开发人员能够专注于实现其服务的核心逻辑,而将其他所有事情都交给框架处理。

而这个框架就是 gRPC。

什么是 gRPC?它是如何工作的?

gRPC 是一个高性能、开源、功能丰富的 RPC 框架,最初由 Google 开发,现在是云原生计算基金会(或 CNCF)的一部分,就像 Kubernetes 或 Prometheus 一样。

好的,那么ggRPC 中的“什么”代表什么呢?起初我以为是 Google(是的,你知道为什么)。但实际上,它在每个 gRPC 版本中代表不同的含义,例如“好”、“绿色”、“辉煌”,甚至“gRPC”本身。

您可以在此链接中查看完整列表

什么是 gRPC

那么 RPC 呢?RPC 是远程过程调用 (Remote Procedure Calls) 的缩写。它是一种允许一个程序执行位于另一台计算机上的另一个程序的协议。

它的一大优点是,开发人员无需明确编写网络交互的细节,底层框架会自动处理。

因此,在客户端代码中,我们看起来就像直接调用了服务器代码中的一个函数。即使客户端和服务器端的代码是用不同的编程语言编写的,它也能正常工作。例如在本例中,客户端代码是用 Go 编写的,而服务器代码是用 Rust 编写的。

什么是 RPC

那么 gRPC 是如何做到这一点的呢?基本上,客户端有一个存根,它提供与服务器相同的方法(或函数)。该存根由 gRPC 自动生成。

存根将在后台调用 gRPC 框架通过网络与服务器交换信息。

瞧,神奇的是,一切都运行起来了。有了存根,客户端和服务器现在只需要关心实现各自的核心服务逻辑。

gRPC 的工作原理

接下来,我们将看到如何在协议缓冲区的帮助下生成 gRPC 存根。

gRPC 如何生成代码?

代码生成是 gRPC 最重要的功能之一。

为了为服务器和客户端生成存根,我们首先需要编写 API 契约,其中包括协议缓冲区文件中的服务及其有效负载消息的描述,如下所示:

定义协议缓冲区消息

在这个文件中,定义了一个 Hello 方法,它接受一个 HelloRequest 作为输入,并返回一个 HelloResponse。HelloRequest 只包含一个字符串 name,而 HelloResponse 则包含一个字符串 greet。

很简单吧?稍后我们将在protobuf实践课程中学习更多相关细节。

从这个 proto 文件中,protocol buffer 编译器(或 protoc)会生成服务器和客户端的存根代码。根据编程语言的不同,我们需要告诉编译器使用正确的 gRPC 插件。

Rust 和 Go 生成的代码看起来像这样:

存根是如何生成的

好的,那么你可能想知道为什么 gRPC 使用协议缓冲区?嗯,原因有很多。

首先,它非常容易阅读和理解。

其次,它是一种可互操作的语言,支持多种语言的自动代码生成

第三,它以二进制格式表示数据,与 JSON 或 XML 等某些基于文本的格式相比,二进制格式体积更小、传输速度更快、序列化效率更高。

它在客户端和服务器之间提供了强类型的 API 契约,使用起来非常安全。

并且它有一套完善的 API 演进规则,以确保向后和向前的兼容性。

为什么使用协议缓冲区

听起来很棒,对吧?但是 gRPC 必须使用 protocol-buffer 吗?

答案是否定的。你可以使用 Google Flatbuffers 或 Microsoft Bond。但在我看来,Protocol Buffer 已经是一个不错的选择。

它支持多种流行的编程语言,官方支持10种,其中Go、Java、NodeJS是纯粹的实现,另外7种是gRPC核心C的包装器,分别是C++、C#、Objective-C、Python、Ruby、Dart和PHP。

此外,还有许多其他语言的非官方库,例如 Swift、Rust、TypeScript、Haskell 等。

支持的编程语言

好了,现在我们知道了 gRPC 是如何生成代码的。希望你觉得它很有趣。

下一讲,我们将探索 gRPC 的另一个秘密武器:HTTP/2。到时候见。


如果您喜欢这篇文章,请订阅我们的 Youtube 频道在 Twitter 上关注我们,以便将来获取更多教程。


如果你想加入我目前在 Voodoo 的优秀团队,请查看我们的职位空缺。你可以远程办公,也可以在巴黎/阿姆斯特丹/伦敦/柏林/巴塞罗那现场办公,但需获得签证担保。

文章来源:https://dev.to/techschoolguru/introduction-to-grpc-why-what-how-4194
PREV
深入了解 MySQL 和 PostgreSQL 中的隔离级别和读取现象
NEXT
使用 Gin 在 Go 中实现 RESTful HTTP API