【从零开始的rust web开发之路 五】rust语言lazy_static加serde_yaml实现读取外部yaml配置

文章目录

前言

web开发离不开外部配置。之前一直用的java springboot开发web。rust有读取yaml的库,可以实现类似的效果

一、lazy_static介绍

lazy_static 是 Rust 语言中一个非常有用的第三方库,它的主要作用是允许开发者在程序中声明并初始化那些需要延迟求值(late initialization)的静态变量。在 Rust 中,通常情况下,静态变量(static)要求在编译时就能确定其值,并且一旦初始化后就不能更改。然而,有些场景下我们可能希望静态变量的初始化过程涉及到复杂的计算或者依赖于运行时环境,这在标准 Rust 中是不允许直接做到的。

lazy_static 宏提供了一种机制,使得我们可以定义这样的静态变量,它们会在第一次被访问时执行初始化逻辑,之后对所有线程可见并保持其初始值不变。这种行为类似于全局单例模式(Global Singleton),确保了初始化仅执行一次,同时解决了编译时不可知初始化值的问题。

下面是一个使用 lazy_static 库来声明和初始化可变静态变量的简单示例:

rust 复制代码
use lazy_static::lazy_static;

// 使用 lazy_static 宏声明一个可变的静态字符串
lazy_static! {
    static ref COMPLEX_STRING: String = {
        // 这个初始化表达式会在首次使用时执行
        let mut s = String::new();
        s.push_str("Hello, ");
        s.push_str("world!");
        s
    };
}

fn main() {
    // 第一次调用时会初始化 COMPLEX_STRING
    println!("{}", COMPLEX_STRING);
    // 后续调用时不再执行初始化逻辑,而是直接使用已初始化的值
    println!("{}", COMPLEX_STRING);
}

二、serde_yaml介绍

serde_yaml 是 Rust 语言中的一个第三方库,它基于强大的序列化和反序列化框架 Serde(Serialize/Deserialize),专门用于处理 YAML(YAML Ain't Markup Language)格式的数据。Serde 提供了一套泛化的数据结构序列化与反序列化的接口,而 serde_yaml 则是针对 YAML 格式实现的 Serde 的支持库。

YAML 是一种常用的数据序列化格式,以其可读性强、编写方便的特点在配置文件、数据交换等领域广泛应用。通过使用 serde_yaml 库,Rust 程序员可以轻松地将自定义的 Rust 数据结构转换为 YAML 字符串表示,或者从 YAML 字符串解析回对应的 Rust 数据结构。

以下是一些使用 serde_yaml 库的基本操作示例:

rust 复制代码
use serde::{Deserialize, Serialize};
use serde_yaml;

#[derive(Debug, Serialize, Deserialize)]
struct Person {
    name: String,
    age: u8,
    address: Address,
}

#[derive(Debug, Serialize, Deserialize)]
struct Address {
    street: String,
    city: String,
    zip: String,
}

fn main() {
    // 序列化:将 Rust 数据结构转换为 YAML 字符串
    let person = Person {
        name: "Alice".to_string(),
        age: 30,
        address: Address {
            street: "123 Main St.".to_string(),
            city: "Anytown".to_string(),
            zip: "12345".to_string(),
        },
    };

    let yaml_str = serde_yaml::to_string(&person).unwrap();
    println!("Serialized YAML: {}", yaml_str);

    // 反序列化:从 YAML 字符串解析回 Rust 数据结构
    let deserialized_person: Person = serde_yaml::from_str(yaml_str.as_str()).unwrap();
    println!("Deserialized Person: {:?}", deserialized_person);
}

二、正文实战

实现在项目文件夹下创建yaml格式的文件 config.yaml

yaml 复制代码
redis_path: "redis://127.0.0.1:6379/1"  #redis路径
http_web_addr: "0.0.0.0:6003"    #  s300server监听地址

引入依赖

rust 复制代码
tokio = { version = "1.35.1", features = ["full"] }
axum = {version = "0.7.4",features = ["ws"]}
lazy_static = "1.4.0"
serde = { version = "1.0.195", features = ["derive"] }
serde_yaml = "0.9.30"

编写代码

rust 复制代码
//注意字段要匹配文件当中的
#[derive(Debug, Deserialize, Serialize)]
pub struct AppConfig {
    pub redis_path: String,
    pub http_web_addr: String,
}

lazy_static! {
    pub static ref APP_CONFIG: AppConfig = {
        let mut file = File::open("config.yaml").unwrap();
        let mut contents = String::new();
        file.read_to_string(&mut contents).unwrap();
        let config: AppConfig = serde_yaml::from_str(&contents).unwrap();
        println!("配置文件加载成功-------------");
        config
    };
}

#[tokio::main]
async  fn main() {
	println!("{}", APP_CONFIG.redis_path);
	println!("{}", APP_CONFIG.http_web_addr);
}

后续就可以在程序当中全局获取配置数据

相关推荐
考虑考虑8 小时前
数据库中的EXISTS
运维·数据库·后端
刘发财8 小时前
前端2秒生成500页矢量PDF,rust真的强到没朋友
前端·javascript·rust
郑州光合科技余经理9 小时前
国际版外卖系统:税率字段怎么和订单主流程解耦
android·java·开发语言·前端·后端·php·ai编程
毅炼9 小时前
Rover-Suite 开源发布:轻量服务注册中心与网关一体化方案
java·后端·系统架构·gateway
yume_sibai10 小时前
06-Rust Web 开发实战(Axum 框架 + 数据库 + JWT 认证 + 中间件 + 部署)
前端·数据库·rust
苏三说技术13 小时前
为什么越来越多人用OpenWiki?
后端
IT_陈寒13 小时前
Java里用Stream.parallel()翻车实录,这性能还不如单线程
前端·人工智能·后端
Bs_MoneyMagnet13 小时前
基于springboot+vue的生态果园采摘预约系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·毕业设计·计算机毕业设计
码事漫谈14 小时前
FDE 的起源、形态与真实边界
后端
ServBay14 小时前
Grok Bot 还是 OpenClaw?聊聊真正能替人打杂的 AI 智能体
后端·aigc·grok