Rust如何如何使用config配置API

在应用开发中,为了让程序在不同的环境下都能过顺利运行,我们通常会将一些可变项放到配置文件中。Rust也不例外,在Rust中,我们通常使用config crate
在应用开发中,为了让程序在不同的环境下都能过顺利运行,我们通常会将一些可变项放到配置文件中。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内容请搜索好代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好代码网!

标签: Rust config 配置 api