序
本后端项目中使用的技术堆栈主要包括:
Actix Web框架;
日志库;
Serde序列化;
雪花Id生成;
Env获取环境配置;
MongoDB访问;
Lazy_static全局静态初始化;
ELO算法;
在Git提交之前使用预提交进行检查;
具有Github操作的ci;
用中间映像编译代码并创建部署映像;
……
读完这篇文章后,你应该能够了解这些库的用法。
所以唐别废话了,开始吧!
代码实现
代码目录结构
整个项目的目录结构如下(无关文件已删除):
这里对此的解释是:github目录:Github Actions相关配置;
Src目录:项目源代码目录;预提交-配置. yaml:预提交配置;env:项目环境变量的配置;
Cargo.toml:Cargo项目配置;
Makefile:项目编译脚本;
Dockerfile:项目的Docker镜像配置;
Build-image.sh:打包镜像脚本;
对于src目录下的子目录,它这基本上很容易理解。
引入线
货运项目协议程序的切入点是:src/main . RS;
我们从主函数中做了什么:
src/main.rs
在导入文件中,首先启用一些库宏,声明Actix-Web框架的主要功能。
在main函数中,一般后端服务要做的事情已经完成:
获取环境配置;
初始化项目日志;
初始化资源:数据库、Id生成器等。
注册并启动服务;
让让我们分开来看。
和配置日志
获取环境配置
我们可以通过dotenv库分析项目下和系统环境变量中的配置;
只需要下面这句话:
dotenv()。ok();
配置文件如下所示:包封/包围(动词envelop的简写)
MONGODB _ URI=MONGODB://admin:123456 @ localhost:27017/?retry writes=truew=majority log _ LEVEL=info snow flake _ MACHINE _ ID=1 snow flake _ NODE _ ID=1
主要配置MongoDB的连接地址、日志级别和雪花的配置;
上述语句将解决这些配置;
初始化记录器
main函数中的语句初始化记录器:
logger:init();
是由该记录器模块封装的函数:
记录器/调制解调器
上面的代码首先定义了一个全局日志类型记录器;
并在init函数中初始化全局静态变量:LOGGER,用log:set_logger设置;
同时我们从环境变量中获取LOG_LEVEL的日志级别配置(如果没有设置,默认为INFO级别),然后设置;
我们已经为日志记录器实现了log: log trail,这就是为什么我们可以将这种类型的变量设置为Logger!
在log: log trail的实现中,我们简单定义了log的输出格式和输出颜色;
可以看到在很多第三方库的支持下,rust还是很好用的!
初始化资源
接下来我们打电话:
资源:check_resources()。等待;service:init_file_service()。等待;
等待资源初始化完成;
以下初始化文件服务的逻辑非常简单,只是创建了一个临时文件:
我们重点介绍check_resources()函数,其中初始化并验证了MongoDB连接和雪花Id生成器;
相关资源的初始化在资源模块中完成;
资源检查功能在资源模块的入口模块中定义:
资源/模型
MongoDB通过Ping验证数据库连接,雪花通过创建Id验证正确性;
那么这些资源在哪里初始化呢?
主要是第一次用的时候被lazy_static初始化!
lazy_static的一个特点是,第一次使用这个变量时,它会被静态初始化;
让让我们分开来看:
src/resource/mongo.rs
上面的代码在lazy_static里!宏,异步初始化MongoDB的连接:
首先从环境变量中获取配置MONGODB_URI,然后初始化并保存在变量:MONGO_CLIENT中;
src/resource/id_generator.rs
类似于上面的初始化,这里我们从环境变量中得到:雪花_机器_ID和雪花_节点_ID,然后使用snowflakeybutter:new进行初始化;
同时,与MongoDB不同,这里需要使用互斥体进行封装,因为很有可能会出现多个线程同时获取ID的情况;
还有MongoDB 的客户端已经是:弧型!
我们还封装了get_id函数,不用暴露ID_GENERATOR_BUCKET变量就可以直接外部调用!
下面是测试我们的Id生成器的单个测试;
此时,我们的资源被初始化。
审计刘清
标签:项目函数环境变量