0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用Actix去写一个类似于Facemash的小项目呢

jf_wN0SrCdH 来源:Rust语言中文社区 作者:JasonkayZK 2022-10-17 09:47 次阅读

前言

本后端项目用到的技术栈主要包括:

Actix Web框架;

Log 日志库;

Serde 序列化;

SnowFlake Id生成;

dotenv 获取环境配置;

MongoDB 存取;

lazy_static 全局静态初始化;

ELO 算法

使用 Pre-Commit 在 Git Commit 前进行校验;

使用 Github Action 进行 CI;

使用中间镜像对代码进行编译并创建部署镜像;

……

阅读了本文,你应该也能够学会上面这些库的用法;

那么废话不多说,直接开始!

代码实现

代码目录结构

整个项目的目录结构如下(已去掉无关文件):

poYBAGNMtIaAIpwlAADdczQJ8JU085.jpg
poYBAGNMtI6AWAl5AADkHHD673g963.jpg

下面来说明:

.github目录:Github Actions 相关配置;

src目录:项目源代码目录;

.pre-commit-config.yaml:Pre-Commit 配置;

.env:项目环境变量配置;

Cargo.toml:Cargo 项目配置;

Makefile:项目编译脚本;

Dockerfile:项目Docker镜像配置;

build-image.sh:打包镜像脚本;

对于 src 目录下的各个子目录,见名知意,基本上很好理解了!

服务入口

Cargo 项目约定程序的入口都是:src/main.rs下;

我们从 main 函数来看做了些什么:

src/main.rs

poYBAGNMtLCAM_zdAAEPcOLib5c346.jpg
poYBAGNMtLeAdg4uAAFKRRzcrmI803.jpg

在入口文件中,首先启用了一些库的宏(Macro),并声明了 Actix-Web 框架的 main 函数;

在 main 函数中,做了一般后端服务都会做的事情:

获取环境配置;

初始化项目日志;

初始化资源:数据库、Id生成器等;

注册并启动服务;

下面我们分别来看

配置与日志

获取环境配置

我们可以通过dotenv库解析位于项目下、以及系统环境变量中的配置;

只需要下面一句话即可:

dotenv().ok();

配置文件如下:

.env

MONGODB_URI=mongodb://admin:123456@localhost:27017/?retryWrites=true&w=majority

LOG_LEVEL=INFO

SNOWFLAKE_MACHINE_ID=1

SNOWFLAKE_NODE_ID=1

主要是配置了 MongoDB 的连接地址、日志级别、SnowFlake 的配置;

上面的语句会将这些配置解析;

初始化Logger

main 函数中的这条语句初始化了 Logger:

logger::init();

这个是 logger 模块封装的一个函数:

logger/mod.rs

poYBAGNMtRuAQkHCAAFTnp-cuYs047.jpg
pYYBAGNMtSOAJBjmAAEiPn5_Rqw372.jpg
poYBAGNMtSuAUUFjAAAVfjEqdXI635.jpg

上面的代码首先定义了一个全局日志类型 Logger;

并在 init 函数中初始化了全局静态变量:LOGGER,并使用log::set_logger进行了设置;

同时,我们我们从环境变量中获取LOG_LEVEL日志级别配置(如果未设置,则默认为INFO级别),随后进行了设置;

我们为我们的 Logger 实现了log::LogTrait,这也是为什么我们能将该类型的变量设置为Logger的原因!

在log::LogTrait 的实现中,我们简单定义了日志的输出格式以及输出颜色;

可以看到有了很多第三方库的支持,rust 还是非常好用的!

初始化资源

接下来我们调用:

resource::check_resources().await;

service::init_file_service().await;

来等待资源初始化完成;

下面初始化文件服务的逻辑非常简单,只是创建了一个临时文件:

poYBAGNMtUiAUT0lAABbTftLM2k740.jpg

我们重点来看check_resources()函数,在其中初始化并校验了 MongoDB 连接以及 SnowFlake Id生成器;

资源相关的初始化都是在 resource 模块中完成的;

resource 模块的入口 mod.rs 中定义了资源的校验函数:

resource/mod.rs

pYYBAGNMtWCAJyUEAAEIfuGOXRM316.jpg

MongoDB 通过 Ping 校验了数据库连接,而 SnowFlake 通过创建了一个 Id 校验了正确性;

那么这些资源是在哪里初始化的呢?

主要是通过lazy_static在首次使用的时候初始化的!

lazy_static的一个特性是:在首次使用这个变量的时候,才会进行静态初始化;

下面分别来看:

src/resource/mongo.rs


poYBAGNMtXqAbgGGAADafBb3PZ4550.jpg

上面的代码在lazy_static!宏中,异步初始化了 MongoDB 的连接:

首先,从环境变量中获取配置MONGODB_URI,随后进行了初始化,并保存至变量:MONGO_CLIENT中;

src/resource/id_generator.rs

pYYBAGNMtZaAP2TxAAGDpFa-Y-8671.jpg
pYYBAGNMtZ6AeRwQAACJ1okOwBg373.jpg

与上面的初始化类似,这里从环境变量中获取:SNOWFLAKE_MACHINE_ID和SNOWFLAKE_NODE_ID,随后使用SnowflakeIdBucket::new进行了初始化;

同时,和 MongoDB 不同的是,这里需要使用Mutex进行封装,因为极有可能多个出现多个线程并发获取Id;

而 MongoDB 的 Client 已经是:Arc类型了!

我们也封装了 get_id 函数,直接供外部调用,而无需暴露ID_GENERATOR_BUCKET变量!

最下面是一个单测,用于测试我们的 Id 生成器;

至此,我们的资源初始化完成。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    315

    浏览量

    21011
  • rust语言
    +关注

    关注

    0

    文章

    57

    浏览量

    3009
  • mongodb
    +关注

    关注

    0

    文章

    22

    浏览量

    367

原文标题:用Actix写的一个类似于Facemash的小项目总结

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    高低压隔离电路,类似于氩弧焊电路

    想做一个类似于氩弧焊的电路,高压引弧,电弧1-2mm就可以了,然后是大电流输出,15a以内,通过调节占空比调节输出电流大小。给触发信号,先是高压引弧电路放电,然后低压部分放出
    发表于 11-27 19:04

    想做一个类似于电子琴里面那个集成电路,求大神帮忙

    我想做一个类似于电子琴里面那个集成电路,和芯片。求大神帮忙,必有重谢。
    发表于 08-18 19:07

    labview中有类似于c语言中的宏定义吗

    如题,labview中有类似于c语言中的宏定义吗 define xxx XXX。。。多谢~
    发表于 10-05 15:04

    请问有没有类似于按键的东西

    我需要做一个类似于按键的东西,可以高电平起来,低电平下去。也可以人为按下去,然后自己起来。 补充内容 (2018-11-16 13:02): 原理都知道,怎么设计或者买到找东西
    发表于 11-01 22:25

    请问类似于正弦函数的查找表怎么实现?

    RT,类似于正弦函数的查找表这么实现?现在想做一个查找表的功能,先将表格烧写到外部flash,然后采集外设数据,然后去调用flash里表格,将该数据对应的数据输出,比如表格里1--A2--B 3--C想做个函数,输入1,得到A,输入2,得到B,
    发表于 12-19 08:57

    请问6678 DSP有类似于ID的唯的东西来标识该DSP吗?

    您好! 请问6678 DSP有没有类似于ID的唯的东西来标识该DSP,而且是软件可以获取的,就类似于MAC地址这种。谢谢!
    发表于 01-02 15:05

    设计类似于充电宝指示灯的电路

    设计电路,类似于充电宝,电压最大为10v,有5发光二极管,开启电压为2v,要求10v时五发光二极管都亮,每隔2v灭
    发表于 04-11 09:40

    需要类似于读取16位ADC数据的项目

    直在创建自己的项目,将些示例项目作为参考,但我认为我缺少了些东西,可能很简单。我需要
    发表于 09-04 13:48

    何用Qt做一个类似于发烧友哥的串口助手?

    想用Qt做一个类似于发烧友哥的串口助手,只做了如下的界面,没什么思路。时间可以跑,可以打开串口.希望各位能提点建议 Qt.rar (24.23 KB )
    发表于 11-05 04:35

    请问类似于下面式子是怎么计算的?

    如图,请问是怎么根据设定参数得出有如下的式子,另外遇到类似的式子该如何人计算,为什么这样式子,有什么技巧,我是新手,谢谢!
    发表于 03-13 03:54

    何用RTC时钟配置闹钟

    什么是RTC?RTC的工作原理是什么?RTC时钟源有哪些?如何用RTC时钟配置闹钟
    发表于 11-01 06:46

    请问persimmon如何创建类似于EXCELL的表格

    使用persimmon ui builder 可以使用什么控件创建类似于excell的表格?而且超出的部分可以滚动
    发表于 02-20 15:00

    Facebook推全新AR眼镜项目,功能类似于谷歌的Glass

    Facebook在美国当地时间周三的Facebook Connect 2020大会上宣布了全新的增强现实(AR)眼镜项目——Project Aria,这款眼镜功能上类似于Google Glass。
    的头像 发表于 09-17 16:32 2749次阅读

    ADF9010:900 MHz ISM磁带,类似于RF前线数据Sheet

    ADF9010:900 MHz ISM磁带,类似于RF前线数据Sheet
    发表于 05-19 16:17 0次下载
    ADF9010:900 MHz ISM磁带,<b class='flag-5'>类似于</b>RF前线数据Sheet

    类似于旧Valco和Vox放大器的EQD蜂鸟颤音

    电子发烧友网站提供《类似于旧Valco和Vox放大器的EQD蜂鸟颤音.zip》资料免费下载
    发表于 07-26 09:56 0次下载
    <b class='flag-5'>类似于</b>旧Valco和Vox放大器的EQD蜂鸟颤音