在过去的十年中,REST API 已成为应用程序和系统之间通信的标准选项。然而,2015年,Google 推出了现代开源远程过程调用 gRPC 的概念,它提供了与 REST API 相同的功能,且具有更快、更轻量级和更灵活的服务和通信。因此,现在大多数编程语言都支持 Google Remote Procedure Call(gRPC)。
1. 使用 gRPC
简单地说,gRPC 是一个现代、开源的远程过程调用(RPC)框架,可以在任何地方运行。RPC 是应用程序中的一种函数,可以通过另一个应用程序远程执行。它在分布式系统中尤其常见,其中一台计算机想要调用分布式系统中另一台机器上的方法或函数。
gRPC 与 REST API 类似,都是将托管在服务器上的服务暴露给客户端。
gRPC 和 REST 之间存在一些差异。
- gRPC 使用 HTTP/2,而 REST 使用 HTTP 1.1。这使得 gRPC 能够利用 HTTP/2 的特性,如服务器端和客户端的流式传输。
- gRPC 使用 Protocol Buffers(Protobuf) 数据格式,而 REST 使用 JSON。
- 在传统的 REST API 设置中,客户端使用标准的 HTTP 请求(GET、POST、PUT和DELETE) 与服务器通信,而 gRPC 通过 Protobuf 使用一种更抽象的层次来允许更灵活地通信。
为更详细地说明这些概念,下面将使用 gRPC 实现一个聊天服务。具体来说,将创建一个 gRPC 服务器和客户端,并使用 Protobuf 来创建双方之间的聊天服务。
2. 设置服务
我们需要额外的服务,这些服务未包含在典型的 Go 安装中。我们需要下载和安装以下应用程序以及创建一个用户目录。
- Git
- gRPC
- Protobuf
- protoc
2.1 Git
Git 是一个分布式版本控制工具。要在命令行提示符中验证是否已在计算机上安装了 Git,可输入以下命令。
[root@localhost ~]# git --version
如果系统已经安装了 Git,则此命令将返回当前版本。如果系统尚未安装 Git,可通过 Git 的下载页面 https://git-scm.com/downloads 获取下载和安装说明。
2.2 gRPC
我们还需要在系统上安装 gRPC。可以使用以下命令行安装 gRPC 服务。
[root@localhost ~]# go get -u google.golang.org/grpc
如果安装成功,当运行此命令时,不会在命令提示符中看到任何内容。
2.3 Protobuf
Protobuf 是一种由 Google 开发 的开源跨平台机制,用于将结构化数据进行序列化。可以将 Protobuf 视为 XML 的更轻量级和更快版本。与 XML 一样,我们可以决定数据的结构(使用 proto 文件),然后使用 Protobuf 将结构化数据读写到各种流中。通常,Protobuf 被程序用于存储数据与其他应用程序通信。
可使用以下命令安装 Go 的协议编译器插件(protoc-gen-go)。
[root@localhost ~]# go get github.com/golang/protobuf/protoc-gen-go
这个 go get 指令将下载并保存文件到计算机上的新目录。如果使用的是 macOS 或 Linux,则可以输入以下命令设置路径,以便插件可以找到代码文件。
[root@localhost ~]# export PATH="$PATH:$(go env GOPATH)/bin"
2.4 protoc
安装协议缓冲区编译器(protoc),需要使用版本 3 或以下版本。
- 详细的安装说明可在 Protobuf 的 GitHub 存储库中找到,网址为 https://github.com/protocolbuffers/protobuf。还可以在该页面上找到适用于 macOS 和 Linux 的终端命令。
- 对于 Windows 用户或者对终端命令有疑问者,可从 Protobuf 存储库的 Releases 文件夹中下载适用于你系统的二进制文件。
下载文件后,打开压缩文件夹,将 bin 和 include 子目录复制到你的 user/Go 文件夹中。这将向你的 Go 安装中添加 protoc。你将在 Go 中看到一个现有的 bin 子目录;将新版本粘贴到相同的位置。如果需要,可以对这些文件夹进行合并。
2.5 用户目录
所有程序文件应保存到通过下载文件创建的 usr/Go/src 位置。
- 在 Linux 或 macOS 上,可能的位置是/usr/local/go/src。
- 在 Windows 上,位置为 C:\Users\%USERNAME%\Go\src。
请确认此文件夹是否在你的计算机上。另外还要检查 bin 子目录是否包括以下两个文件。
- protoc.exe
- protoc-gen-go.exe
3. 创建服务器
一旦设置好一切,并确认用户目录已创建且包含适当的文件,就可以继续后续工作。在第一步中,将使用 net 包创建一个简单的服务器,该服务器将在端口 10000 上监听 TCP 连接。这是服务器的最基本版本。
创建一个名为 server.go 的新文件并将其保存到 src 文件夹中。代码如下所示:
package main
import (
"fmt"
"log"
"net"
)
func main() {
listener, err := net.Listen("tcp", ":10000")
fmt.Println(listener)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
}
此时代码并没有做太多事情。它使用 net.Listen 函数在本地网络地址上监听。 net.Listen 的第一个输入是网络类型,第二个参数是端口或地址,在本例中为 10000。注意,网络类型必须是以下值之一。
- tcp
- tcp4
- tcp6
- unix
- unixpacket