作为拥有多年经验的软件开发者,我们都知道 API 在系统当中的重要性——它们无处不在,是应用程序的基石,定义着应用程序之间怎么样通讯。日益增进的技术,爆发式增长的用户需求都在不断的要求我们构建更加高性能的 API。   gRPC定义服务简便;夸语言、跨平台;快捷且可扩展;全双工通讯并内置认证。Golang 原生支持高并发;程序执行高效,语言设计优秀。gPRC 和 Golang 结合起来则能够让我们非常方便的开发出高性能的 API。

gRPC

0x1 gRPC 与 Protocol Buffers 是什么

  RPCRemote Procedure Call 的缩写,gRPC 是 Google 开源的 RPC 框架和库。gRPC 使用 Protocol Buffers 作为其序列化协议。

0x2 安装 gRPC 与 Protocol Buffers

  首先,我们安装 Protocol Buffers 的 Golang 插件:

  接着, 安装 Protocol Buffers 工具。在 MacOS 上,我们可以通过 homebrew 来安装:

0x3 构建 API 服务

  本文以构建一个可以新建、通过 uid 查找用户的命令行交互程序为例来演示如何通过 gRPC 构建高性能的 API。完整的代码可以访问 https://github.com/kofj/ggrpc 获得。程序代码结构如下:

定义服务与消息

  要使用 gRPC,我们需要先定义远程调用的服务和调用服务时传递的消息。gRPC 服务由 .proto 文件定义,并用于生成对应的 .pb.go 文件。下列代码是定义好的 users.proto。

生成 gPRC 代码

  定义好了服务和通讯消息,我们需要使用 Protocol Buffers 的协议编译工具 protoc 来编译生成对应的 .pb.go 文件。

  通过上述命令,我们能编译得到位于 api/users 文件夹的 users.pb.go 文件。这个文件包含了:

  • 生成的服务端和客户端代码;
  • 用于填充,序列化和检索 UserFilterUserInfoCreateUserState 消息类型的代码。

实现服务端程序

  users.pb.go 中的服务器代码只是一个 Interface,具体的逻辑还需要我们自己来实现。UserServer 代码实现如下:

实现客户端程序

  和服务端代码只是个 Interface 不同,users.pb.go 已经为我们实现了客户端代码,我们可以直接调用客户端。首先,连接服务器并创建客户端:

  接着,我们就可以直接调用远程服务了:

运行程序

  前文给出的只是代码片段,我们可以 clone 下完整的代码来运行。

  启动服务器:

  启动客户端:

0x4 结语

  好了,到现在我们已经成功的构建了一个基于 gRPC 的 API 服务。其性能真的更高吗?下次,我们可以尝试与 HTTP REST 构建的 API 服务做一次性能对比实验。