golang 用 gRPC 构建高性能 API
文章目录
作为拥有多年经验的软件开发者,我们都知道 API 在系统当中的重要性——它们无处不在,是应用程序的基石,定义着应用程序之间怎么样通讯。日益增进的技术,爆发式增长的用户需求都在不断的要求我们构建更加高性能的 API。 gRPC定义服务简便;夸语言、跨平台;快捷且可扩展;全双工通讯并内置认证。Golang 原生支持高并发;程序执行高效,语言设计优秀。gPRC 和 Golang 结合起来则能够让我们非常方便的开发出高性能的 API。
0x1 gRPC 与 Protocol Buffers 是什么
RPC
是 Remote 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
文件。这个文件包含了:
- 生成的服务端和客户端代码;
- 用于填充,序列化和检索
UserFilter
、UserInfo
和CreateUserState
消息类型的代码。
实现服务端程序
users.pb.go
中的服务器代码只是一个 Interface,具体的逻辑还需要我们自己来实现。UserServer
代码实现如下:
实现客户端程序
和服务端代码只是个 Interface 不同,users.pb.go
已经为我们实现了客户端代码,我们可以直接调用客户端。首先,连接服务器并创建客户端:
接着,我们就可以直接调用远程服务了:
运行程序
前文给出的只是代码片段,我们可以 clone 下完整的代码来运行。
启动服务器:
启动客户端:
0x4 结语
好了,到现在我们已经成功的构建了一个基于 gRPC 的 API 服务。其性能真的更高吗?下次,我们可以尝试与 HTTP REST 构建的 API 服务做一次性能对比实验。
文章作者 疯魔慕薇
上次更新 2017-09-28