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+React创建富文本编辑器

    Rust+React创建富文本编辑器

    这篇文章主要为大家介绍了Rust+React创建富文本编辑器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Rust中的不安全代码详解

    Rust中的不安全代码详解

    这篇文章主要为大家介绍了Rust中的不安全代码详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Rust 文档注释功能示例代码

    Rust 文档注释功能示例代码

    Rust的文档注释使用特定的格式,以便通过 rustdoc工具生成 API 文档,本文给大家介绍Rust 文档注释功能,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Rust使用kind进行异常处理(错误的分类与传递)

    Rust使用kind进行异常处理(错误的分类与传递)

    Rust 有一套独特的处理异常情况的机制,它并不像其它语言中的 try 机制那样简单,这篇文章主要介绍了Rust指南错误的分类与传递以及使用kind进行异常处理,需要的朋友可以参考下
    2022-09-09
  • Rust常用特型之ToOwned特型示例详解

    Rust常用特型之ToOwned特型示例详解

    在Rust中,假定某类型实现了Clone特型,如果给你一个对它引用,那我们得到它指向内容的备份的最常见方式是调用其clone()函数,这篇文章主要介绍了Rust常用特型之ToOwned特型,需要的朋友可以参考下
    2024-04-04
  • Rust中的Box<T>之堆上的数据与递归类型详解

    Rust中的Box<T>之堆上的数据与递归类型详解

    本文介绍了Rust中的Box<T>类型,包括其在堆与栈之间的内存分配,性能优势,以及如何利用Box<T>来实现递归类型和处理大小未知类型,通过Box<T>,Rust程序员可以更灵活地管理内存,避免编译时大小不确定的问题,并提高代码的效率和灵活性
    2025-02-02
  • 深入了解Rust的切片使用

    深入了解Rust的切片使用

    除了引用,Rust 还有另外一种不持有所有权的数据类型:切片(slice),切片允许我们引用集合中某一段连续的元素序列,而不是整个集合。本文让我们来深入了解Rust的切片
    2022-11-11
  • Rust之Rhai脚本编程的示例

    Rust之Rhai脚本编程的示例

    文章介绍了如何在Rust中使用Rhai库执行脚本,包括添加依赖、创建引擎、定义脚本、执行脚本并处理结果,示例展示了如何定义一个简单的函数并调用它,输出问候信息
    2025-02-02
  • Rust语言中级教程之指针

    Rust语言中级教程之指针

    Rust中共有三种类型的指针,分别为引用,解引用,智能指针,这篇文章主要介绍了Rust语言中级教程之指针,需要的朋友可以参考下
    2023-05-05
  • Rust中的Drop特性之解读自动化资源清理的魔法

    Rust中的Drop特性之解读自动化资源清理的魔法

    Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如Box、Rc和RefCell都依赖于Drop来管理资源,提供了灵活且安全的资源管理方案
    2025-02-02

最新评论