Rust如何使用config配置API

 更新时间:2023年11月14日 12:09:57   作者:涵树  
这篇文章主要介绍了Rust如何使用config配置API,这里记录了如何声明配置类型,读取配置,通过环境变量来覆盖配置值等开发中常见的动作,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

在应用开发中,为了让程序在不同的环境下都能过顺利运行,我们通常会将一些可变项放到配置文件中。Rust也不例外,在Rust中,我们通常使用config crate来实现配置项的读取。

这里记录了如何声明配置类型,读取配置,通过环境变量来覆盖配置值等开发中常见的动作。

步骤

安装依赖

[dependencies]
config = "0.13.1"
serde = { version = "1.0.164", features = ["derive"] }

声明配置struct

我们虽然可以通过config提供的api,去一个字段一个字段的读取配置,这种方式显然不安全。

安全的做法是声明一个强类型,然后让config帮我们进行反序列化处理,如果字段有错,会直接报config::ConfigError 。从而避免让配置错误成为漏网之鱼,去干扰后面的正常逻辑。

models.rs

use serde::Deserialize;
#[derive(Debug, Default, Deserialize)]
pub struct AppConfig {
    pub server_addr: String,
    pub port: u16,
    pub redis_addr: String,
    pub redis_port: u16,
    pub route_mapping: Vec<RouteMapping>,
}
#[derive(Deserialize, Debug, Clone)]
pub struct RouteMapping {
    pub prefix: String,
    pub target: String,
}

serde::Deserialize几乎成了Rust生态中的序列化和反序列化的标准,只有让我们的类型实现serde::Deserialize trait,config才能为我们从配置文件中反序列化。

创建配置文件

配置文件一般放在项目的根目录中,我们这里命名为config.toml

server_addr="0.0.0.0"
port=8000
redis_addr="redis-token"
redis_port=6379
[[route_mapping]]
prefix="/api/notes/"
target="notes-api"

注意,route_mapping这里是列表的形式。

添加配置项加载代码

完成了上面的准备工作,我们就可以通过下面的代码读取配置数据了。

mod models;
use config::{Config, File};
use models::AppConfig;
fn main() -> _ { 
   let config_ = Config::builder()
        .add_source(File::with_name("config.toml"))
        .build()
        .expect("构建配置错误");
    let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件错误");
    println!("server_addr:{}", config.server_addr);
    ...
}

上面代码中的错误未作处理,错误处理和当前上下文有关,可以参考我的《Rust-错误处理魔法》

添加环境变量

到目前为止,我们完成了从声明配置项到读取配置数据的过程。但是,在实际开发中,由于环境的原因,我们需要根据不同的运行环境来调整某些配置项。

比如上面的redis_addr,我们在开发的时候,它的值是redis-token,可能部署到生产环境后,这个值就变成其它的了。但是,如果每次切换环境都去改这个值,显然是很不方便且容易出错的。

最简单的方式是通过环境变量来覆盖对应的值,幸运的是config为我们提供了这个功能。代码调整如下:

mod models;
use config::{Config, Environment, File};
use models::AppConfig;
fn main() -> _ { 
   let config_ = Config::builder()
        .add_source(File::with_name("config.toml"))
        .add_source(Environment::with_prefix("api-gate"))
        .build()
        .expect("构建配置错误");
    let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件错误");
    println!("server_addr:{}", config.server_addr);
    ...
}

config会为我们用环境变量前缀为api-gate的值,去覆盖从config.toml中读取的值。

以上面的redis_addr为例,执行代码如下:

export api-gate_redis_addr=192.168.3.175
cargo run

总结

我们通过config crate来读取配置。先要声明配置对应的类型(struct),然后通过反序列化的方式来读取配置的数据。这是一种安全的方式。

我们还可以通过环境变量来动态修改配置的值。这一点使得我们的应用在部署时更加灵活,也更加专业。

到此这篇关于Rust-使用config配置你的API的文章就介绍到这了,更多相关Rust使用config配置api内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • C++的替代:微软如何使用rust?

    C++的替代:微软如何使用rust?

    这篇文章主要介绍了微软如何使用rust的,帮助大家了解c++和rust这两门编程语言的联系与区别,感兴趣的朋友可以了解下
    2020-09-09
  • RUST异步流处理方法详细讲解

    RUST异步流处理方法详细讲解

    这篇文章主要介绍了RUST异步流处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • 使用vscode配置Rust运行环境全过程

    使用vscode配置Rust运行环境全过程

    VS Code对Rust有着较完备的支持,这篇文章主要给大家介绍了关于使用vscode配置Rust运行环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Rust中不可变变量与const的区别详解

    Rust中不可变变量与const的区别详解

    Rust作者认为变量默认应该是immutable,即声明后不能被改变的变量,这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust中不可变变量与const的区别,需要的朋友可以参考下
    2024-02-02
  • Rust语言从入门到精通系列之Iterator迭代器深入详解

    Rust语言从入门到精通系列之Iterator迭代器深入详解

    这篇文章主要为大家介绍了Rust语言从入门到精通系列之Iterator迭代器深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 关于Rust?使用?dotenv?来设置环境变量的问题

    关于Rust?使用?dotenv?来设置环境变量的问题

    在项目中,我们通常需要设置一些环境变量,用来保存一些凭证或其它数据,这时我们可以使用dotenv这个crate,接下来通过本文给大家介绍Rust?使用dotenv来设置环境变量的问题,感兴趣的朋友一起看看吧
    2022-01-01
  • Rust如何进行模块化开发技巧分享

    Rust如何进行模块化开发技巧分享

    Rust模块化,模块化有助于代码的管理和层次逻辑的清晰,本文主要介绍了Rust如何进行模块化开发,结合实例代码给大家讲解的非常详细,需要的朋友可以参考下
    2023-01-01
  • rust延迟5秒锁屏的实现代码

    rust延迟5秒锁屏的实现代码

    这篇文章主要介绍了rust延迟5秒锁屏的实现代码,文中通过实例代码也介绍了rust计算程序运行时间的方法,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Rust实现一个表达式Parser小结

    Rust实现一个表达式Parser小结

    这篇文章主要为大家介绍了Rust实现一个表达式Parser小结,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Rust 原始指针功能探索

    Rust 原始指针功能探索

    这篇文章主要为大家介绍了Rust 原始指针功能探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论

?


http://www.vxiaotou.com