使用 gRPC

在过去的十年中,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,可输入以下命令。

bash 复制代码
[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,则可以输入以下命令设置路径,以便插件可以找到代码文件。

bash 复制代码
[root@localhost ~]# export PATH="$PATH:$(go env GOPATH)/bin"
2.4 protoc

安装协议缓冲区编译器(protoc),需要使用版本 3 或以下版本。

下载文件后,打开压缩文件夹,将 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 文件夹中。代码如下所示:

Go 复制代码
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
相关推荐
秃头佛爷几秒前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨2 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师3 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉3 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java5 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山5 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust