Rust如何使用config配置API

 更新时间:2023年11月14日 12:09:57   作者:涵树  
这篇文章主要介绍了Rust如何使用config配置API,这里记录了如何声明配置类型,读取配置,通过环境变量来覆盖配置值等开发中常见的动作,需要的朋友可以参考下
在应用开发中,为了让程序在不同的环境下都能过顺利运行,我们通常会将一些可变项放到配置文件中。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读取配置文件的实现步骤

    Rust读取配置文件的实现步骤

    任何项目都离不开对于配置文件的读取和解析,rust项目也一样,本文主要介绍了Rust读取配置文件的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • 解析Rust struct 中的生命周期

    解析Rust struct 中的生命周期

    rust 的生命周期保证了内存的安全性,同时也增加了开发者的心智负担。是在上线之前多费心思写代码,还是在上线以后忙忙活活查问题,这是个 trade off 问题,这篇文章主要介绍了Rust struct 中的生命周期,需要的朋友可以参考下
    2022-10-10
  • Rust 智能指针实现方法

    Rust 智能指针实现方法

    这篇文章主要介绍了Rust 智能指针的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • 使用Rust采集天气预报信息并实现实时更新数据功能

    使用Rust采集天气预报信息并实现实时更新数据功能

    Rust作为一种高效、安全的编程语言,可以用于开发各种应用,包括天气预报采集系统,本文将探讨如何使用Rust来采集天气预报信息,并实现实时更新数据的功能,文中通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • Rust中不可变变量与const的区别详解

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

    Rust作者认为变量默认应该是immutable,即声明后不能被改变的变量,这一点是让跨语言学习者觉得很别扭,不过这一点小的改变带来了诸多好处,本节我们来学习Rust中不可变变量与const的区别,需要的朋友可以参考下
    2024-02-02
  • 使用Cargo工具高效创建Rust项目

    使用Cargo工具高效创建Rust项目

    这篇文章主要介绍了使用Cargo工具高效创建Rust项目,本文有关Cargo工具的使用和Rust输入输出知识感兴趣的朋友一起看看吧
    2022-08-08
  • 详解Rust中的workspace

    详解Rust中的workspace

    这篇文章主要向大家介绍Rust中的workspace,主要内容包括基础应用、实用技巧、原理机制等方面,这个概念在Rust中是通用的,只不过maven换成了cargo,而模块变成了crate,下面跟着小编通过一个例子给大家介绍下
    2022-03-03
  • 在Rust中编写自定义Error的详细代码

    在Rust中编写自定义Error的详细代码

    Result<T, E> 类型可以方便地用于错误传导,Result<T, E>是模板类型,实例化后可以是各种类型,但 Rust 要求传导的 Result 中的 E 是相同类型的,所以我们需要编写自己的 Error 类型,本文给大家介绍了在Rust中编写自定义Error的详细代码,需要的朋友可以参考下
    2024-01-01
  • Rust用宏实现参数可变的函数的实现示例

    Rust用宏实现参数可变的函数的实现示例

    本文主要介绍了Rust用宏实现参数可变的函数的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-03-03
  • RUST异步流处理方法详细讲解

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

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

最新评论