欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用Actix去寫(xiě)一個(gè)類似于Facemash的小項(xiàng)目呢

jf_wN0SrCdH ? 來(lái)源:Rust語(yǔ)言中文社區(qū) ? 作者:JasonkayZK ? 2022-10-17 09:47 ? 次閱讀

前言

本后端項(xiàng)目用到的技術(shù)棧主要包括:

Actix Web框架;

Log 日志庫(kù);

Serde 序列化;

SnowFlake Id生成;

dotenv 獲取環(huán)境配置;

MongoDB 存取;

lazy_static 全局靜態(tài)初始化;

ELO 算法;

使用 Pre-Commit 在 Git Commit 前進(jìn)行校驗(yàn);

使用 Github Action 進(jìn)行 CI;

使用中間鏡像對(duì)代碼進(jìn)行編譯并創(chuàng)建部署鏡像;

……

閱讀了本文,你應(yīng)該也能夠?qū)W會(huì)上面這些庫(kù)的用法;

那么廢話不多說(shuō),直接開(kāi)始!

代碼實(shí)現(xiàn)

代碼目錄結(jié)構(gòu)

整個(gè)項(xiàng)目的目錄結(jié)構(gòu)如下(已去掉無(wú)關(guān)文件):

poYBAGNMtIaAIpwlAADdczQJ8JU085.jpg
poYBAGNMtI6AWAl5AADkHHD673g963.jpg

下面來(lái)說(shuō)明:

.github目錄:Github Actions 相關(guān)配置;

src目錄:項(xiàng)目源代碼目錄;

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

.env:項(xiàng)目環(huán)境變量配置;

Cargo.toml:Cargo 項(xiàng)目配置;

Makefile:項(xiàng)目編譯腳本;

Dockerfile:項(xiàng)目Docker鏡像配置;

build-image.sh:打包鏡像腳本;

對(duì)于 src 目錄下的各個(gè)子目錄,見(jiàn)名知意,基本上很好理解了!

服務(wù)入口

Cargo 項(xiàng)目約定程序的入口都是:src/main.rs下;

我們從 main 函數(shù)來(lái)看做了些什么:

src/main.rs

poYBAGNMtLCAM_zdAAEPcOLib5c346.jpg
poYBAGNMtLeAdg4uAAFKRRzcrmI803.jpg

在入口文件中,首先啟用了一些庫(kù)的宏(Macro),并聲明了 Actix-Web 框架的 main 函數(shù);

在 main 函數(shù)中,做了一般后端服務(wù)都會(huì)做的事情:

獲取環(huán)境配置;

初始化項(xiàng)目日志;

初始化資源:數(shù)據(jù)庫(kù)、Id生成器等;

注冊(cè)并啟動(dòng)服務(wù);

下面我們分別來(lái)看

配置與日志

獲取環(huán)境配置

我們可以通過(guò)dotenv庫(kù)解析位于項(xiàng)目下、以及系統(tǒng)環(huán)境變量中的配置;

只需要下面一句話即可:

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 的連接地址、日志級(jí)別、SnowFlake 的配置;

上面的語(yǔ)句會(huì)將這些配置解析;

初始化Logger

main 函數(shù)中的這條語(yǔ)句初始化了 Logger:

logger::init();

這個(gè)是 logger 模塊封裝的一個(gè)函數(shù):

logger/mod.rs

poYBAGNMtRuAQkHCAAFTnp-cuYs047.jpg
pYYBAGNMtSOAJBjmAAEiPn5_Rqw372.jpg
poYBAGNMtSuAUUFjAAAVfjEqdXI635.jpg

上面的代碼首先定義了一個(gè)全局日志類型 Logger;

并在 init 函數(shù)中初始化了全局靜態(tài)變量:LOGGER,并使用log::set_logger進(jìn)行了設(shè)置;

同時(shí),我們我們從環(huán)境變量中獲取LOG_LEVEL日志級(jí)別配置(如果未設(shè)置,則默認(rèn)為INFO級(jí)別),隨后進(jìn)行了設(shè)置;

我們?yōu)槲覀兊?Logger 實(shí)現(xiàn)了log::LogTrait,這也是為什么我們能將該類型的變量設(shè)置為L(zhǎng)ogger的原因!

在log::LogTrait 的實(shí)現(xiàn)中,我們簡(jiǎn)單定義了日志的輸出格式以及輸出顏色;

可以看到有了很多第三方庫(kù)的支持,rust 還是非常好用的!

初始化資源

接下來(lái)我們調(diào)用:

resource::check_resources().await;

service::init_file_service().await;

來(lái)等待資源初始化完成;

下面初始化文件服務(wù)的邏輯非常簡(jiǎn)單,只是創(chuàng)建了一個(gè)臨時(shí)文件:

poYBAGNMtUiAUT0lAABbTftLM2k740.jpg

我們重點(diǎn)來(lái)看check_resources()函數(shù),在其中初始化并校驗(yàn)了 MongoDB 連接以及 SnowFlake Id生成器;

資源相關(guān)的初始化都是在 resource 模塊中完成的;

resource 模塊的入口 mod.rs 中定義了資源的校驗(yàn)函數(shù):

resource/mod.rs

pYYBAGNMtWCAJyUEAAEIfuGOXRM316.jpg

MongoDB 通過(guò) Ping 校驗(yàn)了數(shù)據(jù)庫(kù)連接,而 SnowFlake 通過(guò)創(chuàng)建了一個(gè) Id 校驗(yàn)了正確性;

那么這些資源是在哪里初始化的呢?

主要是通過(guò)lazy_static在首次使用的時(shí)候初始化的!

lazy_static的一個(gè)特性是:在首次使用這個(gè)變量的時(shí)候,才會(huì)進(jìn)行靜態(tài)初始化;

下面分別來(lái)看:

src/resource/mongo.rs


poYBAGNMtXqAbgGGAADafBb3PZ4550.jpg

上面的代碼在lazy_static!宏中,異步初始化了 MongoDB 的連接:

首先,從環(huán)境變量中獲取配置MONGODB_URI,隨后進(jìn)行了初始化,并保存至變量:MONGO_CLIENT中;

src/resource/id_generator.rs

pYYBAGNMtZaAP2TxAAGDpFa-Y-8671.jpg
pYYBAGNMtZ6AeRwQAACJ1okOwBg373.jpg

與上面的初始化類似,這里從環(huán)境變量中獲?。篠NOWFLAKE_MACHINE_ID和SNOWFLAKE_NODE_ID,隨后使用SnowflakeIdBucket::new進(jìn)行了初始化;

同時(shí),和 MongoDB 不同的是,這里需要使用Mutex進(jìn)行封裝,因?yàn)闃O有可能多個(gè)出現(xiàn)多個(gè)線程并發(fā)獲取Id;

而 MongoDB 的 Client 已經(jīng)是:Arc類型了!

我們也封裝了 get_id 函數(shù),直接供外部調(diào)用,而無(wú)需暴露ID_GENERATOR_BUCKET變量!

最下面是一個(gè)單測(cè),用于測(cè)試我們的 Id 生成器;

至此,我們的資源初始化完成。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 生成器
    +關(guān)注

    關(guān)注

    7

    文章

    320

    瀏覽量

    21159
  • rust語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3031
  • mongodb
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    389

原文標(biāo)題:用Actix寫(xiě)的一個(gè)類似于Facemash的小項(xiàng)目總結(jié)

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    個(gè)高低壓隔離電路,類似于氬弧焊電路

    想做一個(gè)類似于氬弧焊的電路,高壓引弧,電弧1-2mm就可以了,然后是大電流輸出,15a以內(nèi),通過(guò)調(diào)節(jié)占空比調(diào)節(jié)輸出電流大小。給個(gè)觸發(fā)信號(hào),先是高壓引弧電路放電,然后低壓部分放出
    發(fā)表于 11-27 19:04

    想做一個(gè)類似于電子琴里面那個(gè)集成電路,求大神幫忙

    我想做一個(gè)類似于電子琴里面那個(gè)集成電路,和芯片。求大神幫忙,必有重謝。
    發(fā)表于 08-18 19:07

    labview中有類似于c語(yǔ)言中的宏定義嗎

    如題,labview中有類似于c語(yǔ)言中的宏定義嗎 define xxx XXX。。。多謝~
    發(fā)表于 10-05 15:04

    請(qǐng)問(wèn)有沒(méi)有類似于按鍵的東西

    我需要做一個(gè)類似于按鍵的東西,可以高電平起來(lái),低電平下去。也可以人為按下去,然后自己起來(lái)。 補(bǔ)充內(nèi)容 (2018-11-16 13:02): 原理都知道,怎么設(shè)計(jì)或者買到找東西
    發(fā)表于 11-01 22:25

    請(qǐng)問(wèn)類似于正弦函數(shù)的查找表怎么實(shí)現(xiàn)?

    RT,類似于正弦函數(shù)的查找表這么實(shí)現(xiàn)?現(xiàn)在想做一個(gè)查找表的功能,先將表格燒寫(xiě)到外部flash,然后采集外設(shè)數(shù)據(jù),然后去調(diào)用flash里表格,將該數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù)輸出,比如表格里1--A2--B 3--C想做個(gè)函數(shù),輸入1,得到A,輸入2,得到B,
    發(fā)表于 12-19 08:57

    請(qǐng)問(wèn)6678 DSP有個(gè)類似于ID的唯的東西來(lái)標(biāo)識(shí)該DSP嗎?

    您好! 請(qǐng)問(wèn)6678 DSP有沒(méi)有個(gè)類似于ID的唯的東西來(lái)標(biāo)識(shí)該DSP,而且是軟件可以獲取的,就類似于MAC地址這種。謝謝!
    發(fā)表于 01-02 15:05

    設(shè)計(jì)個(gè)類似于充電寶指示燈的電路

    設(shè)計(jì)個(gè)電路,類似于充電寶,電壓最大為10v,有5個(gè)發(fā)光二極管,開(kāi)啟電壓為2v,要求10v時(shí)五個(gè)發(fā)光二極管都亮,每隔2v滅
    發(fā)表于 04-11 09:40

    需要個(gè)類似于讀取16位ADC數(shù)據(jù)的項(xiàng)目

    直在創(chuàng)建自己的項(xiàng)目,將些示例項(xiàng)目作為參考,但我認(rèn)為我缺少了些東西,可能很簡(jiǎn)單。我需要
    發(fā)表于 09-04 13:48

    何用Qt做一個(gè)類似于發(fā)燒友哥的串口助手?

    想用Qt做一個(gè)類似于發(fā)燒友哥的串口助手,只做了如下的界面,沒(méi)什么思路。時(shí)間可以跑,可以打開(kāi)串口.希望各位能提點(diǎn)建議 Qt.rar (24.23 KB )
    發(fā)表于 11-05 04:35

    請(qǐng)問(wèn)類似于下面式子是怎么計(jì)算的?

    如圖,請(qǐng)問(wèn)是怎么根據(jù)設(shè)定參數(shù)得出有如下的式子,另外遇到類似的式子該如何人計(jì)算,為什么這樣寫(xiě)式子,有什么技巧,我是個(gè)新手,謝謝!
    發(fā)表于 03-13 03:54

    何用RTC時(shí)鐘配置個(gè)鬧鐘

    什么是RTC?RTC的工作原理是什么?RTC時(shí)鐘源有哪些?如何用RTC時(shí)鐘配置個(gè)鬧鐘
    發(fā)表于 11-01 06:46

    請(qǐng)問(wèn)persimmon如何創(chuàng)建類似于EXCELL的表格?

    使用persimmon ui builder 可以使用什么控件創(chuàng)建類似于excell的表格?而且超出的部分可以滾動(dòng)
    發(fā)表于 02-20 15:00

    Facebook推全新AR眼鏡項(xiàng)目,功能類似于谷歌的Glass

    Facebook在美國(guó)當(dāng)?shù)貢r(shí)間周三的Facebook Connect 2020大會(huì)上宣布了全新的增強(qiáng)現(xiàn)實(shí)(AR)眼鏡項(xiàng)目——Project Aria,這款眼鏡功能上類似于Google Glass。
    的頭像 發(fā)表于 09-17 16:32 ?2798次閱讀

    ADF9010:900 MHz ISM磁帶,類似于RF前線數(shù)據(jù)Sheet

    ADF9010:900 MHz ISM磁帶,類似于RF前線數(shù)據(jù)Sheet
    發(fā)表于 05-19 16:17 ?0次下載
    ADF9010:900 MHz ISM磁帶,<b class='flag-5'>類似于</b>RF前線數(shù)據(jù)Sheet

    類似于舊Valco和Vox放大器的EQD蜂鳥(niǎo)顫音

    電子發(fā)燒友網(wǎng)站提供《類似于舊Valco和Vox放大器的EQD蜂鳥(niǎo)顫音.zip》資料免費(fèi)下載
    發(fā)表于 07-26 09:56 ?0次下載
    <b class='flag-5'>類似于</b>舊Valco和Vox放大器的EQD蜂鳥(niǎo)顫音