使用 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 上获得。

从今天开始,我们将开始我们的Rust语言学习之路。Rust 语言是一种高效、可靠的通用高级语言。其高效不仅限于开发效率,它的执行效率也是令人称赞的,是一种少有的兼顾开发效率和执行效率的语言。

首先我们需要搭建好开发环境,本次选用linux作为服务器系统,也是为以后项目环境做考虑。毕竟windows作为服务器系统还是过于小众。

如果您曾经安装过 rustup,可以执行 rustup update 来升级 Rust。

在ssh界面运行以下命令:

如果您熟悉rustup安装程序并希望自定义安装,请选择第二个选项。 但是,出于本教程的考虑,我们仅选择默认的第一个选项,然后按Enter。

在 Rust 开发环境中,所有工具都安装在 ~/.cargo/bin 目录中,您可以在这里找到包括 rustc、cargo 和 rustup 在内的 Rust 工具链。

运行以下命令

运行以下命令

如果出现以下版本号则证明安装成功

如果想卸载 Rust,您可以运行

如果想更新Rust,可以运行

腐蚀 RUST游戏指令和服务器指令一览,在服务器中,管理员也可以利用指令来管理游戏中不正当行为。下面就给大家带来腐蚀RUST基本指令及服务器指令大全,以供玩家们参考。

基本指令

(以下在聊天框内输入)

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

/me【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处可写理由,挂狗和无(B)素(I)质(U)狗去死吧)】

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.(以服务器身份说话)】

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.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.(开始物品空降,当在线人数至少“X”人的时候)】

vehicle.spawn 【Spawns a car at your current position.( 放置 一辆车,在你当前位置,管理装B专用)】

server.hostname 【Sets a hostname.(设置服务器名称)】

server.clienttimeout "time"【Sets the time until someone times out. Good to fight item glitchers. (Default 2 minutes)(设置超时时长,默认为2分钟)】

server.pvp true/false 【Sets PVP on or off.(开启PVP)】

server.maxplayers "amount" 【Sets maximum amount of server slots.(设置最大玩家数量)】

sleepers.on true/false 【Sets sleepers on or off.(是否允许睡眠模式)】

env.time "amount" 【Sets the time of day to a specified value.(设置天的时间)】

falldamage.enabled true/false 【Turns fall damage on or off.(开启/关闭掉落伤害)】

RUST++ MOD

(以下在聊天框内输入)

基本命令

/share playername 【shares your doors with a player(共享你的门给一个玩家)】

/unshare playername 【unshares your doors with a player(解除对一个玩家的门共享)】

/help 【Shows commands(显示所有指令)】

/pm "playername" "message" 【private messages a player.(私聊一个玩家,名字必须写全)】

/r message here 【quick reply to last PM(快速回复上一个私聊你的玩家)】

/history 【Shows chat history, last 6 messages by default(显示前6个聊天内容)】

/players 【Shows online players(显示当前在线玩家)】

/location 【Shows the coordinates of the player(显示玩家的当前坐标)】

/ping 【shows latency between client and server(显示服务器的延迟)】

/starter 【gives a configurable starter kit(给予初始装备)】

/friends 【shows your friends list(显示朋友列表)】

/addfriend playername 【adds a player to your friends list(添加一个玩家为好友)】

/unfriend playername 【removes a friend(移除一个好友)】

/about 【shows server mod version(显示服务器版本)】

管理员命令

/announce message here 【ADMIN ONLY - announces a message to the server(发送服务器公告)】

/loadout 【ADMIN ONLY - spawns you an admin loadout set in the config file(生成一个管理操作记录在设置文件夹下)

RustEssentials MOD

(以下在聊天框内输入)

/access {on} 【(Gives the sender access to all doors,给予你打开所有门的权限)】

/access {off} 【(Revokes access to all doors from the sender,移除你打开所有门的权限)】

/airdrop 【(Spawns an airdrop with a random drop location,设置一次随地地点的空降)】

/airdrop【(Spawns an airdrop with a drop location at the specified player,设置一次空降给某个玩家)】

/ban【(Bans player with reason: "Banned by a(n)",封掉一个玩家)】

/ban[reason] 【(Bans player with reason,封掉一个玩家和愿意)】

/chan {g} 【(Joins the global chat,加入全球聊天屏道)】

/chan {global} 【(Joins the global chat,同上)】

/chan {d} 【(Joins the direct chat,加入一个特定聊天屏道)】

/chan {direct} 【(Joins the direct chat,同上)】

/give【(Gives the item to that player,给一个玩家指定物品)】

/give[amount] 【(Gives the amount of the item to that player,给一个玩家指定物品和数量)】

/give[item id] 【(Gives 1 of the item with the corresponding id to that player,给一个玩家指定的物品,这里用的是物品ID)】

/give[item id] [amount] 【(Gives the amount of the item with the corresponding id to that player,给一个玩家指定的物品和数量,这里用的是物品ID)】

/god【(Gives the specified player god mode,给指定玩家上帝模式)】

/heal *player name* 【(Heals the designated player,恢复指定玩家的血)】

/help 【(Returns available commands for your current rank,显示指令)】

/help [command without /] 【(Returns the documentation and syntax for the specified command,显示已经排除外的指令,without/后面填上你不想显示的指令)】

/history {1-50} 【(Returns the the last # lines of the chat history,查看聊天记录,1-50里面填你想查看前面多少条记录)】

/i【(Gives the item to you,给自己指定物品)】

/i[amount] 【(Gives the amount of the item to you,给自己指定物品和数量)】

/i [item id] 【(Gives 1 of the item with the corresponding id to you,给自己指定物品,这里用的是物品ID)】

/i [item id] [amount] 【(Gives the amount of the item with the corresponding id to you,给自己指定物品和数量,这里用的是物品ID)

/join 【(Emulates the joining of yourself, 模拟 自己加入游戏)】

/join【(Emulates the joining of a fake player,加入一个机器人到游戏中)】

/kick【(Kick player with reason: "Kicked by a(n)",踢出一个玩家)】

/kick[reason] 【(Kick player with reason,踢出一个玩家和愿意)】

/kickall 【(Kicks all users, except for the command executor, out of the server踢出所有玩家,除了输入这条指令者)】

/kill【(Kills the specified player,杀死一个指定玩家)】

/kit [kit name] 【(Gives the user the specified kit if the user has the correct authority level,给一个用户指定套装,当这个玩家有指定的权限的时候)

/kits 【(Lists the kits available to you,列出自己所有能用的套装)】

/leave 【(Emulates the leaving of yourself,模拟自己离开游戏)】

/leave【(Emulates the leaving of a fake player,模拟一个机器人离开游戏)】

/mute【(Mutes the player on global chat,禁言一个玩家)】

/online 【(Returns the amount of players currently connected,显示所有服务器在线玩家)】

/pm*message* 【(Sends a private message to that player,私聊某个玩家)】

/pos 【(Returns the player's position,显示玩家所在的坐标)

/reload {config/whitelist/ranks/commands/kits/motd/bans/all} 【(Reloads the specified file,重新加载指定的文件)】

/save 【(Saves all world data,保存世界数据)】

/say *message* 【(Says a message through the plugin,以服务器身份说话,在公屏上)】

/saypop *message* 【(Says a (!) dropdown message to all clients,弹出一段话,在玩家屏幕上)】

/saypop [icon] *message* 【(Says a dropdown message to all clients with designated icon),以icon的什么弹出一段话,在玩家屏幕上】

/share *player name* 【(Shares ownership of your doors with the designated user,共享门给指定玩家)】

/stop 【(Saves, deactivates, and effectively stops the server,停止服务器并保存)】

/time 【(Returns current time of day,显示当前世界时间)】

/time {0-24} 【(Sets time to a number between 0 and 24,设置当前世界时间)】

/time {day} 【(Sets time to day,设置为白天)】

/time {freeze} 【(Freezes time,冻住当前时间)】

/time {night} 【(Sets time to night,设置为晚上)】

/time {unfreeze} 【(Unfreezes time,解冻当前时间)】

/timescale 【(Returns the speed at which time passes,显示当前时间流逝速度)】

/timescale [#] 【(Sets the speed at which time passes. Recommended between 0 and 1. WARNING: THIS AFFECTS AIRDROPS,设置时间流逝速度,在0和1之间,警告!这个将影响到空降时间)】

/uid 【(Returns your steam UID,显示你的steamID)】

/uid *player name* 【(Returns that user's steam UID,显示指定玩家的steamID)】

/unban【(Unbans the specified player,解封指定玩家)】

/ungod【(Revokes god mode from the specified player,解除指定玩家的上帝模式)】

/unmute【(Unmutes the player on global chat,解除指定玩家的禁言)】

/unshare {all} 【(Revokes ownership of your doors from everyone,解除对所有玩家的门共享)

/unshare *player name*【(Revokes ownership of your doors from the designated user,解除对指定玩家的门共享)

/version 【(Returns the current running version of Rust Essentials,重置Rust Essentials模组的版本)

/whitelist {add} [UID] 【(Adds the specified Steam UID to the whitelist,把指定steamID添加至白名单)】

/whitelist {check} 【(Checks if you're currently on the whitelist,查询白名单)】

/whitelist {kick} 【(Kicks all players that are not whitelisted. This only work if whitelist is enabled,踢出所有在白名单的人,如果白名单已经启动)】

/whitelist {off} 【(Turns whitelist off,关掉白名单)】

/whitelist {on} 【(Turns whitelist on,打开白名单)】

/whitelist {rem} [UID] 【(Removes the specified Steam UID to the whitelist,移除指定steamID从白名单)】


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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存