使用 Rust 构建 gRPC 服务器

使用 Rust 构建 gRPC 服务器,第1张

弗洛里安·克鲁姆 ( Florian Krumm ) 在Unsplash上拍摄的照片

一旦我了解了gRPC和Thrift,就很难再回到使用更具过渡性的基于 JSON 的 REST API 或SOAP API 了。

两个著名的RPC框架 gRPC 和 Thrift 有很多相似之处。前者源自谷歌,后者源自Facebook。它们都易于使用,对多种编程语言都有很好的支持,并且都具有高性能。

最有价值的功能是多种语言的代码生成以及服务器端反射。这些使 API 本质上是类型安全的。使用服务器端反射,可以更轻松地 探索 API 的模式定义,而无需阅读和理解实现。

Apache Thrift在 历史 上一直是一个流行的选择。然而近年来,由于缺乏来自 Facebook 的持续支持,以及与fbthrift的分叉分叉,慢慢失去了人气。

与此同时,gRPC 已经赶上了越来越多的功能,拥有更 健康 的生态系统。

GRPC(蓝色)与 Apache Thrift(红色)的比较。谷歌趋势

gRPC、fbThrift 和 Apache Thrift 之间的 GitHub 明星 历史 。https://star-history.com

到今天为止,除非您的应用程序以某种方式隶属于 Facebook,否则没有充分的理由考虑 Thrift。

GraphQL是另一个由 Facebook 发起的框架。它与上面的两个 RPC 框架有很多相似之处。

移动 API 开发的最大痛点之一是一些用户从不升级他们的应用程序。因为我们想保持向后兼容性,我们要么必须在 API 中保留旧的未使用字段,要么创建 API 的多个版本。GraphQL 的一个动机就是解决这个问题。它被设计成一种“查询语言”,允许客户端指定它需要的数据字段。这使得处理向后兼容性变得更容易。

GraphQL 在开发移动 API 以及面向公众的 API(例如GitHub)方面具有巨大价值。因为,在这两种情况下,我们都无法轻易控制客户端的行为。

但是,如果我们正在为 Web 前端构建 API 或为内部后端服务构建 API,那么选择 GraphQL 而不是 gRPC 几乎没有什么好处。

以上是迄今为止网络框架的一个小概述。除了网络,我们还需要决定应用服务器的语言。

基于Stack Overflow 调查:“六年来,Rust 是最受欢迎的语言。” 尽管学习曲线相对陡峭,但它的类型安全、优雅的内存管理、广泛的社区支持和性能,都使 Rust 成为一种非常有吸引力和有前途的后端服务开发编程语言。

Rust 是最受欢迎的语言。2021 年 Stackoverflow 调查

我们也开始看到 Rust 在行业中得到越来越广泛的采用:Facebook、Dropbox、Yelp、AWS、Google等。很明显,Rust 将继续增长并继续存在。

这就是我们将在今天的教程中看到的内容——在 Rust 中使用 gRPC 构建一个小型服务器。

使用以下命令安装 Rust:

如果您以前安装过 Rust,我们可以通过以下方式对其进行更新:

让我们仔细检查rustc(Rust 编译器)和cargo(Rust 包管理器)的安装版本:

有关安装的更多信息,请查看https://www.rust-lang.org/tools/install。

运行以下命令创建一个新的“Hello World”项目:

让我们编译并运行程序:

这显示了我们到目前为止的文件结构:

gRPC 使用协议缓冲区来序列化和反序列化数据。.proto让我们在一个文件中定义服务器 API 。

我们定义了一个书店服务,只有一个方法:提供一个书本 id,并返回有关该书的一些详细信息。

我们将使用tonic创建我们的 gRPC 服务。将以下依赖项添加到Cargo.toml文件中:

为了从 生成 Rust 代码bookstore.proto,我们tonic-build在 crate 的build.rs构建脚本中使用。

将以下内容添加到build.rs文件中:

需要特别指出的一件事是,我们添加它.out_dir(“./src”)是为了将默认输出目录更改为该src目录,以便我们可以更轻松地查看生成的文件,以达到本文的目的。

在我们准备编译之前还有一件事。tonic-build依赖于Protocol Buffers 编译器将文件解析.proto为可以转换为 Rust 的表示。让我们安装protobuf:

并仔细检查 protobuf 编译器是否安装正确:

准备编译:

有了这个,我们应该src/bookstore.rs生成一个文件。此时,我们的文件结构应该如下所示:

最后,是时候将服务放在一起了。替换为main.rs以下内容:

正如我们所见,为了简单起见,我们并没有真正的图书设置数据库。在这个端点中,我们只是返回一本假书。

运行服务器的时间:

很好,我们在 Rust 中启动并运行了 gRPC 服务器!

正如开头所说,gRPC 最初给我留下了深刻的印象,因为它具有做服务器反射的能力。它不仅在服务开发过程中很方便,而且还使与前端工程师的沟通变得更加容易。因此,如果不解释如何为 Rust 服务器添加它,那么结束本教程是不完整的。

将以下内容添加到依赖项中:

更新build.rs。需要更改的行用// Add this注释标记。

最后,将其更新main.rs为以下内容。

有许多 GUI 客户端可以使用 gRPC Server,例如Postman、Kreya、bloomrpc、grpcox等。为了简单起见,我们将使用命令行工具grpc_cli。

安装:

并测试我们的第一个 gRPC 端点:

看起来它有效!我的朋友,这就是我们在 Rust 中构建 gRPC 服务器的方式。

这就是今天的内容。感谢阅读和快乐的编码!与往常一样,源代码可在GitHub 上获得。

基本指令

(以下在聊天框内输入)

/msg <player><message>【message a specified player(私信一个玩家)】

/me <message>【Puts your text into a purple color(你的文字将以紫色发出)】

(以下在控制台内输入,按F1)

grass.on true/false 【Enables or disables grassImproves FPS for some.(打开/关闭草地,可提高FPS)】

grass.displacement 【true/false Enables or disables grass displacements.(打开关闭草地移动)】

terrain.idleinterval 0-100 【Sets how often to draw unseen terrainsetting to 0 will disable.(远景更新平率,0为不允许)】

gui.show 【Turns the UI on.(显示用户界面)】

gui.hide 【Turns the UI off.(关闭用户界面)】

gui.show_branding 【Turns the branding UI in top-right corner on.(显示右上角的标识)】

gui.hide_branding 【Turns the branding UI in top-right corner off.(隐藏右上角的标识)】

net.connect "Server IP" 【Connect to a direct server IP.(连接服务器IP,Server IP出填写服务器的IP)】

net.disconnect 【Disconnects from a server.(断开服务器连接)】

net.reconnect 【Reconnect to the last server you were on.(重新连接上一个服务器)】

censor.nudity false 【Disabled censorship.(关闭裸体)】

suicide 【Kills your character allowing for a respawn.(自杀)】

quit 【Quits the game.(退出游戏)】

服务器指令

rcon.login "password" 【Use your 'Password' to login into Rcon via ingame console (F1).(使用控制台登录服务器)】

status 【See how many players are online on server.(查看在线玩家数量)】

notice.popupall "message" 【Pops up a message for all players.(发送服务器公告,在每个玩家屏幕上弹出)】

find * 【Lists available console commands.(列出控制台指令)】

kick "player" 【Kicks player from the server.(踢出某个玩家)】

ban "player" or "steamid" 【Bans player. Doesn't kick him though.(封掉一个玩家)】

banid "steamid" "reason" 【Bans a steamid from the server.(封掉一个玩家的steamID,reason处可写理由)】

unbanall 【Unbans all players.(解封所有玩家)】

truth.enforce true/false 【Server kicks people automatically when they are doing "weird" things.(服务器自动踢出做奇怪事情的人,如卡BUG)】

save.all 【Saves world map and player inventory(服务器保存当前地图和玩家信息).】

say [message] 【Sends a message to the person/s in-game globally.(以服务器身份说话)】

teleport.toplayer "player 1" "player 2"【 Teleports 'player 1' to 'player 2'. Case sensetive. Full name required.(传送“玩家1”到“玩家2”)】

teleport.topos "player 1" "Pos X" "Pos Y" "Pos Z" 【Teleports 'player 1' to the coordinates. Full name required.(传送“玩家1”到“坐标X”“坐标Y”“坐标Z”)】

inv.giveplayer "player" "item" "amount" 【Gives 'Player' the 'Item'. Full name and Item name required. List of Items.(给玩家东西,“玩家”“物品”“数量”)】

inv.giveall "item" "amount" 【Gives all players 'Item'. Full Item name required. List of Items.(给所有人东西,“玩家”“物品”“数量”,比如节日的时候,可以作为惊喜,没人给一把枪什么的)】

dmg.godmode true/false 【Gives all logged in admins godmode.(开启/关闭所有人创造模式)】

crafting.complete 【Completes every single crafting job in progress for everyone.(允许制作任何东西)】

crafting.cancel 【Cancels every single crafting job in progress for everyone.(取消制作任何东西)】

crafting.instant true/false 【Sets crafting to be instant for everyone.(开启/关闭瞬间制作)】

crafting.instant_admins true/false 【Sets crafting to be instant for logged in admins only.(开启/关闭管理员瞬间制作)】

crafting.timescale "amount" 【Sets the timescale of crafting to 'amount' (1 = default, 0.5 = half time).(设置制作物品时间的速度,1为默认,0.5为一半时间)】

airdrop.drop 【Starts an airdrop.(进行一次物品空降)】

airdrop.min_players "amount" 【Starts airdrops only when minimum X players are online.(开始物品空降,当在线人数至少“数量”人的时候)】

rusvt服务器一排英文的名字是Steam上的游戏,想要搭建游戏服务器都必须要有一个SteamCMD命令行的执行程序包,该程序的目的是快速下载和更新本地的游戏服务器程序。下载地址:https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip

下载完成后将该压缩包解压,将文件夹内的Steamcmd.exe 程序拷贝至你想要安装该程序的目录下,然后双击执行即可,等待命令行程序执行完毕。Rust 服务器程序下载,想要下载Rust 服务器,需要执行一段SteamCmd程序的命令:

1. 进入刚才安装SteamCmd程序的目录,拷贝目录地址

2. Windows键+R键,在输入框中输入cmd 点击执行

3. 在命令行中右键黏贴目录地址同时在后面加上steamcmd.exe 回车执行

4. 当命令行显示 steam>时,输入下列命令每行一个输入后回车

login anonymous ------以匿名的方式登录steam

force_install_dir "c:rustserver" ------设置服务器的安装目录

app_update 258550 ------安装或者更新 ID为258550的游戏服务器

quit -------退出

上述命令中,c:rustserver 该路径为你想要将Rust服务器安装的目录,替换成自己的即可。祝您生活愉快,谢谢提问

欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/503802.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-06-17
下一篇2023-06-17

发表评论

登录后才能评论

评论列表(0条)

    保存